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

// Host code
/* Rust API */
#[derive(Debug)]
pub enum Commands {
    #[allow(non_camel_case_types)]
    no_return {
        name: trixy::types::newtypes::String,
    },
}
/* C API */
// Workaround rust rules when implementing a foreign trait on a foreign type
#[derive(Debug)]
pub struct OurResult<T, E> {
    value: Result<T, E>,
}
impl<T, E> std::ops::Deref for OurResult<T, E> {
    type Target = Result<T, E>;

    fn deref(&self) -> &Self::Target {
        &self.value
    }
}
impl<T, E> From<Result<T, E>> for OurResult<T, E> {
    fn from(value: Result<T, E>) -> Self {
        Self { value }
    }
}

#[derive(Debug)]
pub struct OurOption<T> {
    value: Option<T>,
}
impl<T> std::ops::Deref for OurOption<T> {
    type Target = Option<T>;

    fn deref(&self) -> &Self::Target {
        &self.value
    }
}

impl<T> From<Option<T>> for OurOption<T> {
    fn from(value: Option<T>) -> Self {
        Self { value }
    }
}
#[derive(Debug)]
pub struct OurVec<T> {
    value: Vec<T>,
}
impl<T> std::ops::Deref for OurVec<T> {
    type Target = Vec<T>;

    fn deref(&self) -> &Self::Target {
        &self.value
    }
}

impl<T> From<Vec<T>> for OurVec<T> {
    fn from(value: Vec<T>) -> Self {
        Self { value }
    }
}
/* The real C API */
#[no_mangle]
pub extern "C" fn no_return(name: trixy::types::String) -> core::ffi::c_int {
    let error = std::panic::catch_unwind(|| {
        crate::callback_function(crate::Commands::no_return {
            name: match name.try_into() {
                Ok(ok) => ok,
                Err(err) => {
                    trixy::types::traits::errno::set(err.into());
                    return 0;
                }
            },
        });
        0
    });
    if let Err(_) = error {
        eprintln!("Catched a panic just before the c ffi.");
        std::process::exit(1);
    }
    return 1;
}
// vim: filetype=rust