localize_it 2.1.0

Simple and fast library for localization
Documentation
use crate::arguments::Arguments;
use proc_macro2::{Ident, LineColumn, Span};
use std::hash::{DefaultHasher, Hash, Hasher};
use syn::{Path, PathSegment};

pub struct Names<'a> {
    hash: u64,
    arguments: &'a Arguments,
}

impl<'a> Names<'a> {
    pub fn new(arguments: &'a Arguments) -> Self {
        let span = Span::call_site();
        let file = span.file();
        let LineColumn { line, column } = span.start();

        let mut hasher = DefaultHasher::new();
        file.hash(&mut hasher);
        line.hash(&mut hasher);
        column.hash(&mut hasher);
        let hash = hasher.finish();

        Self { hash, arguments }
    }

    pub fn get_name(&self, name: &str) -> Ident {
        Ident::new(name, Span::call_site())
    }

    pub fn get_hashed_name(&self, name: &str) -> Ident {
        Ident::new(&format!("__{}_{}", name, self.hash), Span::call_site())
    }

    pub fn get_path(&self, name: &str) -> Path {
        let name = self.get_name(name);

        self.arguments
            .path
            .clone()
            .map(|mut path| {
                path.segments.push(PathSegment::from(name.clone()));

                path
            })
            .unwrap_or(Path::from(name))
    }
}