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/>.
*/

//! This module generates the c header
//! It works by firstly listing the functions and then by grouping them into structures, effectively
//! simulating namespaces in c.

use crate::{
    macros::config::trixy::TrixyConfig, parser::command_spec::CommandSpec, types::header_names,
};

mod pure_header;
mod structs_init;
mod typedef;

const BEGIN_HEADER_GUARD: &'static str = r"#if !defined TRIXY_MAIN_HEADER
        #define TRIXY_MAIN_HEADER";
const END_HEADER_GUARD: &'static str = r"#endif // if !defined TRIXY_MAIN_HEADER";

/// This function acts as the core transformative aspect, turning this Trixy code into the
/// following c header:
///
/// *Trixy:*
/// ```text
/// fn fn_alone();
/// mod one {
///     fn fn_one();
///     mod two {
///         fn fn_two();
///         mod three {
///             fn fn_three();
///         }
///     }
/// }
/// ```
/// *C header:*
/// ```text
/// #if !defined TRIXY_MAIN_HEADER
/// #define TRIXY_MAIN_HEADER
///
/// extern int fn_alone();
/// extern int one_fn_one();
/// extern int one_two_fn_two();
/// extern int one_two_three_fn_three();
///
/// struct three {
///   void (*fn_three)(void);
/// };
/// struct two {
///   void (*fn_two)(void);
///   three_t three;
/// };
/// struct one {
///   void (*fn_one)(void);
///   two_t two;
/// } ;
///
/// const struct three three = {
///     .fn_three = one_two_three_fn_three,
/// };
/// const struct two two = {
///     .fn_two = one_two_fn_two,
///     .three = three,
/// };
/// const struct one one = {
///     .fn_one = one_fn_one,
///     .two = two,
/// };
/// #endif // if !defined TRIXY_MAIN_HEADER
/// ```
pub fn generate(trixy: &CommandSpec, _config: &TrixyConfig) -> String {
    let pure_header = pure_header::generate(&trixy);

    let type_defs = typedef::generate(&trixy);

    let structs_init = structs_init::generate(&trixy);

    format!(
        "{}\n\n{}\n\n{}\n{}\n{}\n\n{}",
        BEGIN_HEADER_GUARD,
        header_names(),
        pure_header,
        type_defs,
        structs_init,
        END_HEADER_GUARD
    )
}