start of cbind proc_macro: just pulling out required elements from syn parse tree (name, fn name, ret type)
This commit is contained in:
commit
763bf69112
|
@ -0,0 +1,3 @@
|
||||||
|
/target
|
||||||
|
Cargo.lock
|
||||||
|
.idea
|
|
@ -0,0 +1,17 @@
|
||||||
|
[package]
|
||||||
|
name = "cbinder"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
authors = ["Dan Ballard <dan@mindstab.net>"]
|
||||||
|
license = "MIT"
|
||||||
|
description = "proc-macro to generate memory safe rust native bindings from bindgen for Open Privacy c libraries"
|
||||||
|
|
||||||
|
[lib]
|
||||||
|
proc-macro = true
|
||||||
|
|
||||||
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
syn = { version = "1.0", features = ["full"] }
|
||||||
|
quote = "1.0"
|
||||||
|
regex = "1"
|
|
@ -0,0 +1,53 @@
|
||||||
|
use proc_macro::TokenStream;
|
||||||
|
|
||||||
|
use quote::quote;
|
||||||
|
use syn;
|
||||||
|
|
||||||
|
// cbind!(fn start_cwtch(app_dir: &str, tor_path: &str) -> i32 {c_StartCwtch});
|
||||||
|
#[proc_macro]
|
||||||
|
pub fn cbind(_def: TokenStream) -> TokenStream {
|
||||||
|
//dbg!(&_def);
|
||||||
|
let ast: syn::ItemFn = syn::parse(_def).unwrap();
|
||||||
|
|
||||||
|
dbg!(&ast);
|
||||||
|
|
||||||
|
let fn_name = ast.sig.ident;
|
||||||
|
let fn_call = match &ast.block.stmts[0] {
|
||||||
|
syn::Stmt::Expr(expr) => match expr {
|
||||||
|
syn::Expr::Path(expr) => Ok(expr.path.segments[0].ident.to_string()),
|
||||||
|
_ => Err("".to_string()),
|
||||||
|
}
|
||||||
|
_ => Err("".to_string()),
|
||||||
|
};
|
||||||
|
let ret_type = match &ast.sig.output {
|
||||||
|
syn::ReturnType::Type(_, box_type) => {
|
||||||
|
let ty= &**box_type;
|
||||||
|
match ty {
|
||||||
|
syn::Type::Path(p) => {
|
||||||
|
if p.path.segments.len() == 1 {
|
||||||
|
Some(p.path.segments[0].ident.to_string())
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_ => None
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_ => None
|
||||||
|
};
|
||||||
|
|
||||||
|
dbg!(fn_call);
|
||||||
|
dbg!(ret_type);
|
||||||
|
let args = ast.sig.inputs;
|
||||||
|
|
||||||
|
quote!(fn #fn_name(&self) {}).into()
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
#[test]
|
||||||
|
fn it_works() {
|
||||||
|
let result = 2 + 2;
|
||||||
|
assert_eq!(result, 4);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue