HiveBrain v1.2.0
Get Started
← Back to all entries
snippetrustCritical

How do I get an enum as a string?

Submitted by: @import:stackoverflow-api··
0
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:

enum Foo {
    Bar = 0x00,
    Baz = 0x01,
    Qux = 0x02,
    // ...
    Quux = 0xFF,
}


I can derive Debug and do

writer.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 Debug isn'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 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.