From 4fdfb821dcd325c645ec500c3d4a47b4c1c7dfc0 Mon Sep 17 00:00:00 2001 From: Lukas Kalbertodt Date: Sun, 2 Jul 2023 10:13:04 +0200 Subject: [PATCH] Fix enum deserialization from env values Fixes #31 --- src/env/mod.rs | 13 ++++++++++++- tests/env.rs | 19 +++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 tests/env.rs diff --git a/src/env/mod.rs b/src/env/mod.rs index e917aa3..d1cb600 100644 --- a/src/env/mod.rs +++ b/src/env/mod.rs @@ -116,6 +116,18 @@ impl<'de> serde::Deserializer<'de> for Deserializer { visitor.visit_newtype_struct(self) } + fn deserialize_enum( + self, + _name: &str, + _variants: &'static [&'static str], + visitor: V, + ) -> Result + where + V: serde::de::Visitor<'de>, + { + visitor.visit_enum(self.value.into_deserializer()) + } + serde::forward_to_deserialize_any! { char str string bytes byte_buf @@ -127,7 +139,6 @@ impl<'de> serde::Deserializer<'de> for Deserializer { ignored_any // TODO: think about manually implementing these - enum seq tuple tuple_struct } diff --git a/tests/env.rs b/tests/env.rs new file mode 100644 index 0000000..91a4ca9 --- /dev/null +++ b/tests/env.rs @@ -0,0 +1,19 @@ +use serde::Deserialize; +use confique::{Config}; + +#[derive(Debug, Deserialize)] +enum Foo { A, B, C } + + +#[test] +fn enum_env() { + #[derive(Config)] + struct Conf { + #[config(env = "FOO")] + foo: Foo, + } + + std::env::set_var("FOO", "B"); + let conf = Conf::builder().env().load(); + assert!(matches!(conf, Ok(Conf { foo: Foo::B }))); +}