fix(macros/generate): Correctly generate function types
This commit is contained in:
parent
7a8dc66876
commit
9a8ccc9cc2
|
@ -52,6 +52,23 @@ impl Identifier {
|
|||
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 => {
|
||||
todo!("'{}' is not yet supported", other)
|
||||
}
|
||||
|
|
|
@ -42,7 +42,11 @@ impl Type {
|
|||
}
|
||||
}
|
||||
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 = output.to_rust();
|
||||
quote! {
|
||||
|
|
|
@ -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
|
||||
```
|
Reference in New Issue