snippetrustCritical
How do I get an enum as a string?
Viewed 0 times
stringenumhowget
Problem
I have an enum with many values and I'd like to write the name of one of its values to a stream:
I can derive
which will output e.g.
enum Foo {
Bar = 0x00,
Baz = 0x01,
Qux = 0x02,
// ...
Quux = 0xFF,
}I can derive
Debug and dowriter.write(format!("I am {:?}", Foo::Quux).as_bytes())which will output e.g.
I am Quux. That's fine, except that- I want to do this for user-facing output, so
Debugisn't appropriate
- It would be very helpful to get the enum as a string (rather than writing directly to a stream), because then I can incorporate its length into some wonky formatting calculations I want to do.
Solution
Probably the easiest way would be to implement
Then you can use
If you have many enums which you want to print, you can write a trivial macro to generate the above implementation of
Unfortunately, in Rust reflective programming is somewhat difficult. There is no standard way, for example, to get a list of all variants of a C-like enum. Almost always you have to abstract the boilerplate with custom-written macros (or find something on crates.io). Maybe this will change in the future if someone would write an RFC and it would get accepted.
Display by calling into Debug:impl fmt::Display for Foo {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{:?}", self)
// or, alternatively:
// fmt::Debug::fmt(self, f)
}
}Then you can use
to_string() to get a String representation:let s: String = Foo::Quux.to_string();If you have many enums which you want to print, you can write a trivial macro to generate the above implementation of
Display for each of them.Unfortunately, in Rust reflective programming is somewhat difficult. There is no standard way, for example, to get a list of all variants of a C-like enum. Almost always you have to abstract the boilerplate with custom-written macros (or find something on crates.io). Maybe this will change in the future if someone would write an RFC and it would get accepted.
Code Snippets
impl fmt::Display for Foo {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{:?}", self)
// or, alternatively:
// fmt::Debug::fmt(self, f)
}
}let s: String = Foo::Quux.to_string();Context
Stack Overflow Q#32710187, score: 164
Revisions (0)
No revisions yet.