Skip to content

Latest commit

 

History

History
51 lines (37 loc) · 2.26 KB

README.md

File metadata and controls

51 lines (37 loc) · 2.26 KB

Option sets with built-in Serde support

option_set on crates.io option_set on docs.rs option_set Downloads option_set License Lines of Code Twitter

This crate implements a macro option_set which knows how to serialize and deserialize itself to/from a sequence of strings. The macro invocation looks very much like bitflags!(), with a few useful additions. In fact, the underlying type is generated by the bitflags!() macro, therefore you will need the bitflags crate if you are using this library.

Usage

#[macro_use]
extern crate option_set;
#[macro_use]
extern crate bitflags;
extern crate serde;
extern crate serde_json;

option_set! {
    struct FooOptions: UpperCamel + u16 {
        const BAR_FIRST        = 0x0001;
        const QUX_SECOND_THING = 0x0080;
        const LOL_3RD          = 0x4000;
    }
}

fn main() {
    let opts_in = FooOptions::BAR_FIRST | FooOptions::LOL_3RD;
    let json = serde_json::to_string_pretty(&opts_in).unwrap();

    println!("{}", json);

    let opts_out: FooOptions = serde_json::from_str(&json).unwrap();

    println!("{:?}", opts_out);
    assert!(opts_out == opts_in);
}

In the struct declaration, the first identifier after the colon (UpperCamel in the above example) controls how the name of each flag is transformed before serialization. This is necessary because the flags are not real struct fields or enum variants, so #[serde(rename_all = "...")] and the like don't work on them.

The possible name transformations are the variants of the CaseTransform enum.

The second type, after the + sign, is the underlying type of the bitmask, which is usually an exact-width integer.

License

MIT