use std::ops::Deref;
use proc_macro2::TokenStream as TokenStream2;
use quote::{format_ident, quote};
use crate::parser::command_spec::{Identifier, Namespace, Variant};
impl Namespace {
pub fn to_rust_path<T: Deref<Target = Identifier>>(namespaces: &[T]) -> TokenStream2 {
namespaces
.iter()
.fold(TokenStream2::default(), |acc, nasp| {
if nasp.variant == Variant::RootNamespace && nasp.name == "<root>" {
if acc.is_empty() {
quote! {
crate
}
} else {
unreachable!("An root namespace can never come, after another namespcae")
}
} else {
let ident = format_ident!("{}", nasp.name);
if acc.is_empty() {
quote! {
crate :: #ident
}
} else {
quote! {
#acc :: #ident
}
}
}
})
}
pub fn to_rust_path_owned(namespaces: &[Identifier]) -> TokenStream2 {
let vec: Vec<&Identifier> = namespaces.iter().map(|val| val).collect();
Namespace::to_rust_path(&vec)
}
}