use syn::Attribute;
use error::Result;
use meta;
#[derive(Debug, Clone, PartialEq, Eq)]
#[allow(clippy::stutter)]
pub enum SerdeEnumTag {
External,
Untagged,
Internal(String),
Adjacent {
tag: String,
content: String,
},
}
impl SerdeEnumTag {
pub fn from_attrs(attrs: &[Attribute]) -> Result<Self> {
let conv = if let Some(tag) = meta::serde_name_value(attrs, "tag")? {
let tag = meta::value_as_str(&tag)?;
if let Some(content) = meta::serde_name_value(attrs, "content")? {
let content = meta::value_as_str(&content)?;
SerdeEnumTag::Adjacent { tag, content }
} else {
SerdeEnumTag::Internal(tag)
}
} else if meta::has_serde_word(attrs, "untagged")? {
SerdeEnumTag::Untagged
} else {
SerdeEnumTag::External
};
Ok(conv)
}
}
impl Default for SerdeEnumTag {
fn default() -> Self {
SerdeEnumTag::External
}
}