-
Notifications
You must be signed in to change notification settings - Fork 13
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Simple enum keys for HashMaps #49
Comments
For the first case, impl<'de> _serde::Deserialize<'de> for MappingKey {
fn deserialize<__D>(
__deserializer: __D,
) -> _serde::__private::Result<Self, __D::Error>
where
__D: _serde::Deserializer<'de>,
{
#[allow(non_camel_case_types)]
#[doc(hidden)]
enum __Field {
__field0,
__field1,
}
#[doc(hidden)]
struct __FieldVisitor;
impl<'de> _serde::de::Visitor<'de> for __FieldVisitor {
type Value = __Field;
fn expecting(
&self,
__formatter: &mut _serde::__private::Formatter,
) -> _serde::__private::fmt::Result {
_serde::__private::Formatter::write_str(
__formatter,
"variant identifier",
)
}
fn visit_u64<__E>(
self,
__value: u64,
) -> _serde::__private::Result<Self::Value, __E>
where
__E: _serde::de::Error,
{
match __value {
0u64 => _serde::__private::Ok(__Field::__field0),
1u64 => _serde::__private::Ok(__Field::__field1),
_ => _serde::__private::Err(_serde::de::Error::invalid_value(
_serde::de::Unexpected::Unsigned(__value),
&"variant index 0 <= i < 2",
)),
}
}
fn visit_str<__E>(
self,
__value: &str,
) -> _serde::__private::Result<Self::Value, __E>
where
__E: _serde::de::Error,
{
match __value {
"Option1" => _serde::__private::Ok(__Field::__field0),
"Option2" => _serde::__private::Ok(__Field::__field1),
_ => _serde::__private::Err(_serde::de::Error::unknown_variant(
__value, VARIANTS,
)),
}
}
fn visit_bytes<__E>(
self,
__value: &[u8],
) -> _serde::__private::Result<Self::Value, __E>
where
__E: _serde::de::Error,
{
match __value {
b"Option1" => _serde::__private::Ok(__Field::__field0),
b"Option2" => _serde::__private::Ok(__Field::__field1),
_ => {
let __value = &_serde::__private::from_utf8_lossy(__value);
_serde::__private::Err(_serde::de::Error::unknown_variant(
__value, VARIANTS,
))
}
}
}
}
impl<'de> _serde::Deserialize<'de> for __Field {
#[inline]
fn deserialize<__D>(
__deserializer: __D,
) -> _serde::__private::Result<Self, __D::Error>
where
__D: _serde::Deserializer<'de>,
{
_serde::Deserializer::deserialize_identifier(
__deserializer,
__FieldVisitor,
)
}
}
#[doc(hidden)]
struct __Visitor<'de> {
marker: _serde::__private::PhantomData<MappingKey>,
lifetime: _serde::__private::PhantomData<&'de ()>,
}
impl<'de> _serde::de::Visitor<'de> for __Visitor<'de> {
type Value = MappingKey;
fn expecting(
&self,
__formatter: &mut _serde::__private::Formatter,
) -> _serde::__private::fmt::Result {
_serde::__private::Formatter::write_str(__formatter, "enum MappingKey")
}
fn visit_enum<__A>(
self,
__data: __A,
) -> _serde::__private::Result<Self::Value, __A::Error>
where
__A: _serde::de::EnumAccess<'de>,
{
match _serde::de::EnumAccess::variant(__data)? {
(__Field::__field0, __variant) => {
_serde::de::VariantAccess::unit_variant(__variant)?;
_serde::__private::Ok(MappingKey::Option1)
}
(__Field::__field1, __variant) => {
_serde::de::VariantAccess::unit_variant(__variant)?;
_serde::__private::Ok(MappingKey::Option2)
}
}
}
}
#[doc(hidden)]
const VARIANTS: &'static [&'static str] = &["Option1", "Option2"];
_serde::Deserializer::deserialize_enum(
__deserializer,
"MappingKey",
VARIANTS,
__Visitor {
marker: _serde::__private::PhantomData::<MappingKey>,
lifetime: _serde::__private::PhantomData,
},
)
}
} I feel like We have a map looks like |
#51 will address the first issue. However, the second issue is more complex as it involves |
Do you have any ideas on case 2? |
My guess is that for case 2 we need to try various prefixes, i.e. split by |
Like ignoring error |
Tried but |
Maybe support double-underscore separators to allow the user to tell serde-env where to do the splitting. #[derive(Debug, Deserialize, Eq, Hash, PartialEq)]
enum MappingKey {
#[serde(alias = "option_1")]
Option1,
#[serde(alias = "option_2")]
Option2,
} serde-env would know how to handle var |
The first of the tests below passes, however it requires an unusual lower casing of the enum variants otherwise serde fails.
The second of these fails with
Tests
The text was updated successfully, but these errors were encountered: