trixy 0.4.0

A rust crate used to generate multi-language apis for your application
Documentation
/*
* Copyright (C) 2023 - 2024:
* The Trinitrix Project <soispha@vhack.eu, antifallobst@systemausfall.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*
* This file is part of the Trixy crate for Trinitrix.
*
* Trixy is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as
* published by the Free Software Foundation, either version 3 of
* the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* and the GNU General Public License along with this program.
* If not, see <https://www.gnu.org/licenses/>.
*/

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 {
        // PERFORMANCE(@soispha): Reallocating a new vector here can't really be the most efficient
        // way to do this <2024-03-25>
        let vec: Vec<&Identifier> = namespaces.iter().map(|val| val).collect();
        Namespace::to_rust_path(&vec)
        // 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
        //                 }
        //             }
        //         }
        //     })
    }
}