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 proc_macro2::TokenStream as TokenStream2;
use quote::{quote, ToTokens};

use crate::parser::command_spec::{Enumeration, Identifier};

impl Enumeration {
    fn derive_from_paired(
        &self,
        ident_self: &TokenStream2,
        _ident_paired: &TokenStream2,
        paired_type: &TokenStream2,
    ) -> TokenStream2 {
        let match_lines: TokenStream2 = self
            .states
            .iter()
            .map(|state| {
                let name = Into::<Identifier>::into(state).to_rust();
                quote! {
                    #paired_type :: #name => Self :: #name,
                }
            })
            .collect();
        quote! {
            impl From<#paired_type> for #ident_self {
                fn from(value: #paired_type) -> Self {
                    match value {
                        #match_lines
                    }
                }
            }
        }
    }
    /// This function generates the `From<paired_type>` trait implementation for a given c enumeration
    pub fn derive_from_c_paried_rust(&self, paired_type: &TokenStream2) -> TokenStream2 {
        let c_ident = &self.identifier.to_c();
        let ident = &self.identifier.to_rust();

        self.derive_from_paired(&c_ident.into_token_stream(), &ident, &paired_type)
    }

    /// This function generates the `From<paired_type>` trait implementation for a given rust enumeration
    pub fn derive_from_rust_paried_c(&self, paired_type: &TokenStream2) -> TokenStream2 {
        let c_ident = &self.identifier.to_c();
        let ident = &self.identifier.to_rust();

        self.derive_from_paired(&ident, &c_ident.into_token_stream(), &paired_type)
    }
}