fix(macros/generate): Correctly generate function types

This commit is contained in:
Benedikt Peetz 2024-03-27 10:01:07 +01:00
parent 7a8dc66876
commit 9a8ccc9cc2
Signed by: bpeetz
GPG Key ID: A5E94010C3A642AD
3 changed files with 96 additions and 1 deletions

View File

@ -52,6 +52,23 @@ impl Identifier {
const char* const char*
} }
} }
// Unsigned
"u_8" => quote! { uint8_t },
"u_16" => quote! { uint16_t },
"u_32" => quote! { uint32_t },
"u_64" => quote! { uint64_t },
// Signed
"i_8" => quote! { int8_t },
"i_16" => quote! { int16_t },
"i_32" => quote! { int32_t },
"i_64" => quote! { int64_t },
// Float
"f_32" => quote! { float },
"f_64" => quote! { double },
// Other (not yet imlemented)
// ("Option", 1),
// ("Vec", 1),
// ("Result", 2),
other => { other => {
todo!("'{}' is not yet supported", other) todo!("'{}' is not yet supported", other)
} }

View File

@ -42,7 +42,11 @@ impl Type {
} }
} }
pub fn to_rust_function(inputs: &[NamedType], output: &Option<Box<Type>>) -> TokenStream2 { pub fn to_rust_function(inputs: &[NamedType], output: &Option<Box<Type>>) -> TokenStream2 {
let inputs: Vec<TokenStream2> = inputs.iter().map(NamedType::to_rust).collect(); let inputs: Vec<TokenStream2> = inputs
.iter()
.map(|r#type| &r#type.r#type)
.map(Type::to_rust)
.collect();
let output = if let Some(output) = output { let output = if let Some(output) = output {
let output = output.to_rust(); let output = output.to_rust();
quote! { quote! {

View File

@ -0,0 +1,74 @@
# Host files
File path: `out/dir/api.rs`
```rust
// Host code
/* Rust API */
#[derive(Debug)]
pub enum Commands {
/// Call out an outstanding person
#[allow(non_camel_case_types)]
call_me_back_outstanding { callback: fn(String) -> String },
One(one::One),
}
pub mod one {
#[derive(Debug)]
pub enum One {
/// Call out a person
#[allow(non_camel_case_types)]
call_me_back { callback: fn(u32) },
}
}
/* C API */
#[no_mangle]
pub extern "C" fn call_me_back_outstanding(
callback: fn(String) -> String,
) -> core::ffi::c_int {
callback_function(call_me_back_outstanding);
return 1;
}
pub mod one_c {}
#[no_mangle]
pub extern "C" fn one_call_me_back(callback: fn(u32)) -> core::ffi::c_int {
callback_function(one_call_me_back);
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"
/**
Call out an outstanding person
*/
extern int
call_me_back_outstanding (const char *(*name) (const char *name)callback);
/**
Call out a person
*/
extern int one_call_me_back (void (*name) (uint32_t age) callback);
struct one
{
int (*call_me_back) ();
};
const struct one one = {
.call_me_back = one_call_me_back,
};
#endif // if !defined TRIXY_MAIN_HEADER
// vim: filetype=c
```