| 1 | use super::metadata::{InnerVariantExt, InnerVariantMeta}; |
| 2 | use super::occurrence_error; |
| 3 | use syn::{Field, LitStr}; |
| 4 | |
| 5 | pub trait HasInnerVariantProperties { |
| 6 | fn get_variant_inner_properties(&self) -> syn::Result<StrumInnerVariantProperties>; |
| 7 | } |
| 8 | |
| 9 | #[derive (Clone, Default)] |
| 10 | pub struct StrumInnerVariantProperties { |
| 11 | pub default_with: Option<LitStr>, |
| 12 | } |
| 13 | |
| 14 | impl HasInnerVariantProperties for Field { |
| 15 | fn get_variant_inner_properties(&self) -> syn::Result<StrumInnerVariantProperties> { |
| 16 | let mut output: StrumInnerVariantProperties = StrumInnerVariantProperties { default_with: None }; |
| 17 | |
| 18 | let mut default_with_kw: Option = None; |
| 19 | for meta: InnerVariantMeta in self.get_named_metadata()? { |
| 20 | match meta { |
| 21 | InnerVariantMeta::DefaultWith { kw: default_with, value: LitStr } => { |
| 22 | if let Some(fst_kw: default_with) = default_with_kw { |
| 23 | return Err(occurrence_error(fst_kw, snd:kw, attr:"default_with" )); |
| 24 | } |
| 25 | default_with_kw = Some(kw); |
| 26 | output.default_with = Some(value); |
| 27 | } |
| 28 | } |
| 29 | } |
| 30 | |
| 31 | Ok(output) |
| 32 | } |
| 33 | } |
| 34 | |