diff --git a/strum1/Cargo.lock b/strum1/Cargo.lock index fe940e3..e0e451c 100644 --- a/strum1/Cargo.lock +++ b/strum1/Cargo.lock @@ -2,6 +2,12 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "anyhow" +version = "1.0.68" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2cb2f989d18dd141ab8ae82f64d1a8cdd37e0840f73a406896cf5e99502fab61" + [[package]] name = "heck" version = "0.4.0" @@ -45,6 +51,7 @@ dependencies = [ name = "strum1" version = "0.1.0" dependencies = [ + "anyhow", "strum", ] diff --git a/strum1/Cargo.toml b/strum1/Cargo.toml index 2f0fade..f620621 100644 --- a/strum1/Cargo.toml +++ b/strum1/Cargo.toml @@ -7,3 +7,6 @@ edition = "2021" [dependencies] strum = { version = "0.24.1", features = ["derive"] } + +[dev-dependencies] +anyhow = "1.0.68" diff --git a/strum1/README.md b/strum1/README.md new file mode 100644 index 0000000..8dd0884 --- /dev/null +++ b/strum1/README.md @@ -0,0 +1,5 @@ +# strum + +[crates:strum] の例を書く。 + +[crates:strum]: https://crates.io/crates/strum diff --git a/strum1/src/as_ref_str.rs b/strum1/src/as_ref_str.rs new file mode 100644 index 0000000..76c4009 --- /dev/null +++ b/strum1/src/as_ref_str.rs @@ -0,0 +1,27 @@ +// +// impl X for AsRef を追加できる + +#[allow(dead_code)] +#[derive(strum::AsRefStr)] +enum E1 { + A1, + #[strum(serialize = "b")] + B1, + C1(usize), + D1 { + s: String, + }, +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn e1_test() { + assert_eq!(E1::A1.as_ref(), "A1"); + assert_eq!(E1::B1.as_ref(), "b"); + assert_eq!(E1::C1(10).as_ref(), "C1"); + assert_eq!(E1::D1 { s: "s1".to_owned() }.as_ref(), "D1"); + } +} diff --git a/strum1/src/enum_count.rs b/strum1/src/enum_count.rs new file mode 100644 index 0000000..2786056 --- /dev/null +++ b/strum1/src/enum_count.rs @@ -0,0 +1,23 @@ +// +// EnumCount は COUNT を追加できる + +#[allow(dead_code)] +#[derive(strum::EnumCount)] +enum E1 { + A1, + B1, + C1, +} + +#[cfg(test)] +mod tests { + // これがないと E1::COUNT とできない + use strum::EnumCount; + + use super::*; + + #[test] + fn e1_test() { + assert_eq!(E1::COUNT, 3); + } +} diff --git a/strum1/src/main.rs b/strum1/src/main.rs index 3634933..9df9432 100644 --- a/strum1/src/main.rs +++ b/strum1/src/main.rs @@ -1,24 +1,39 @@ -// -// EnumCount は COUNT を追加できる +mod as_ref_str; +mod enum_count; #[allow(dead_code)] -#[derive(strum::EnumCount)] +#[derive(Debug, Eq, PartialEq, strum::EnumString)] enum E1 { A1, + #[strum(serialize = "b")] B1, - C1, + C1(usize), + D1 { + // TODO: Default が取れない場合 + s: String, + }, } #[cfg(test)] mod tests { - // これがないと E1::COUNT とできない - use strum::EnumCount; + use std::str::FromStr; use super::*; #[test] - fn e1_test() { - assert_eq!(E1::COUNT, 3); + fn e1_test() -> anyhow::Result<()> { + assert_eq!(E1::A1, E1::from_str("A1")?); + assert_eq!(E1::A1, E1::try_from("A1")?); + assert!(E1::from_str("B1").is_err()); + assert_eq!(E1::B1, E1::try_from("b")?); + assert_eq!(E1::C1(0), E1::try_from("C1")?); + assert_eq!( + E1::D1 { + s: String::default() + }, + E1::try_from("D1")? + ); + Ok(()) } }