# Host files File path: `out/dir/api.rs` ```rust // Host code /* Rust API */ #[derive(Debug)] pub enum Commands { Trinitrix(trinitrix::Trinitrix), } /// Attribute doc comment pub mod trinitrix { #[derive(Debug)] pub enum Trinitrix { /// Attribute doc comment, but very ##" "## "# " escaped #[allow(non_camel_case_types)] hi { trixy_output: trixy::oneshot::Sender, name: trixy::types::newtypes::String, }, } } /* C API */ pub mod trinitrix_c { #[allow(unused_imports)] use crate::callback_function; } #[no_mangle] pub extern "C" fn trinitrix_hi( output: *mut trixy::types::String, name: trixy::types::String, ) -> core::ffi::c_int { let output_val: trixy::types::String = { let (tx, rx) = trixy::oneshot::channel(); callback_function( Commands::Trinitrix(crate::trinitrix::Trinitrix::hi { trixy_output: tx, name: match name.try_into() { Ok(ok) => ok, Err(err) => { trixy::types::traits::errno::set(err.into()); return 0; } }, }), ); let recv = rx .recv() .expect("The channel should not be closed until this value is received"); recv.into() }; unsafe { std::ptr::write(output, output_val); } return 1; } // vim: filetype=rust ``` # Auxiliary files File path: `dist/interface.h` ```c #if !defined TRIXY_MAIN_HEADER #define TRIXY_MAIN_HEADER #include "errno.h" #include "string.h" #include "vec.h" /** * Attribute doc comment, but very ##" "## "# " escaped */ extern int trinitrix_hi (const char **trixy_output, const char *name); /** * Attribute doc comment */ struct trinitrix { int (*hi) (const char **, const char *); }; const struct trinitrix trinitrix = { .hi = trinitrix_hi, }; #endif // if !defined TRIXY_MAIN_HEADER // vim: filetype=c ```