localize_it 2.4.0

Simple and fast library for localization
Documentation
mod variants;

use crate::{
    backends::init_locale::arguments::variants::Variants,
    utils::{Argument, Input},
};
use proc_macro2::{Ident, Span};
use syn::{spanned::Spanned, Error, Path};

pub struct Arguments {
    pub variants: Variants,
    pub storage: bool,
    pub path: Option<Path>,
    pub default: Ident,
    pub derive: Vec<Path>,
}

impl Arguments {
    pub fn new(input: Input) -> Result<Self, Error> {
        let mut variants = Variants::new();
        let mut storage = false;
        let mut path = None;
        let mut default = None;
        let mut derive = Vec::new();

        for argument in input.into_iter() {
            match argument {
                Argument::Mapped { name, label } => variants.add(name, label),
                Argument::Named { name, value } => match name.to_string().as_str() {
                    "storage" => storage = Input::parse_bool("storage", &value)?,
                    "path" => path = Some(Input::parse_path("path", &value)?),
                    "default" => default = Some(Input::parse_ident("default", &value)?),
                    "derive" => derive = Input::parse_array("derive", &value, Input::parse_path)?,
                    _ => {
                        return Err(Error::new(
                            value.span(),
                            format!("Unknown parameter `{name}`"),
                        ));
                    }
                },
            }
        }

        let default = default.unwrap_or(
            variants
                .first()
                .ok_or(Error::new(
                    Span::call_site(),
                    "Expected at least one locale variant",
                ))?
                .name
                .clone(),
        );

        Ok(Self {
            variants,
            storage,
            path,
            default,
            derive,
        })
    }
}