localize_it 2.5.1

Simple and fast library for localization
Documentation
use crate::utils::{
    errors::{required_argument_error, unknown_argument_error},
    typed_parse::TypedParse,
};
use proc_macro2::Ident;
use syn::{
    parse::{Parse, ParseStream}, Expr, Path, Result, Token,
    Type,
};

pub struct Arguments {
    pub name: Ident,
    pub r#type: Type,
    pub locales: Vec<Ident>,
    pub values: Vec<Expr>,
    pub path: Option<Path>,
}

impl Parse for Arguments {
    fn parse(input: ParseStream) -> Result<Self> {
        let mut name = None;
        let mut r#type = None;
        let mut locales = None;
        let mut values = None;
        let mut path = None;

        input.parse_arguments(|argument, processor| {
            input.parse::<Token![=]>()?;

            match processor.process(&argument)?.as_str() {
                "name" => name = Some(input.parse_ident("name")?),
                "r#type" => r#type = Some(input.parse_type("r#type")?),
                "locales" => locales = Some(input.parse_array("locales", Ident::parse)?),
                "values" => values = Some(input.parse_array("values", Expr::parse)?),
                "path" => path = Some(input.parse_path("path")?),
                _ => return Err(unknown_argument_error(argument)),
            };

            Ok(())
        })?;

        Ok(Self {
            name: name.ok_or(required_argument_error("name"))?,
            r#type: r#type.ok_or(required_argument_error("r#type"))?,
            locales: locales.ok_or(required_argument_error("locales"))?,
            values: values.ok_or(required_argument_error("values"))?,
            path,
        })
    }
}