Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions crates/macros/src/class.rs
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ pub struct Class {
/// A function name called when creating the class entry. Given an instance
/// of `ClassBuilder` and must return it.
pub modifier: Option<String>,
pub flags: Option<String>,
}

#[derive(Debug)]
Expand All @@ -37,6 +38,7 @@ pub enum ParsedAttribute {
pub struct AttrArgs {
name: Option<String>,
modifier: Option<String>,
flags: Option<Expr>,
}

pub fn parser(args: AttributeArgs, mut input: ItemStruct) -> Result<TokenStream> {
Expand Down Expand Up @@ -117,6 +119,7 @@ pub fn parser(args: AttributeArgs, mut input: ItemStruct) -> Result<TokenStream>
let ItemStruct { ident, .. } = &input;
let class_name = args.name.unwrap_or_else(|| ident.to_string());
let struct_path = ident.to_string();
let flags = args.flags.map(|flags| flags.to_token_stream().to_string());
let class = Class {
class_name,
struct_path,
Expand All @@ -125,6 +128,7 @@ pub fn parser(args: AttributeArgs, mut input: ItemStruct) -> Result<TokenStream>
docs: comments,
properties,
modifier: args.modifier,
flags,
..Default::default()
};

Expand Down
29 changes: 28 additions & 1 deletion crates/macros/src/startup_function.rs
Original file line number Diff line number Diff line change
Expand Up @@ -121,14 +121,41 @@ fn build_classes(classes: &HashMap<String, Class>) -> Result<Vec<TokenStream>> {
}
});

let flags = {
if let Some(flags) = &class.flags {
let mut name = "::ext_php_rs::flags::ClassFlags::".to_owned();
name.push_str(flags);
let expr: Expr = syn::parse_str(&name).map_err(|_| {
anyhow!("Invalid expression given for `{}` flags", class_name)
})?;
Some(quote! { .flags(#expr) })
} else {
None
}
};

let object_override = {
if let Some(flags) = &class.flags {
if flags == "Interface" {
None
} else {
Some(quote! { .object_override::<#ident>() })
}
} else {
Some(quote! { .object_override::<#ident>() })
}
};

Ok(quote! {{
let builder = ::ext_php_rs::builders::ClassBuilder::new(#class_name)
#(#methods)*
#(#constants)*
#(#interfaces)*
// #(#properties)*
#parent
.object_override::<#ident>();
#flags
#object_override
;
#class_modifier
let class = builder.build()
.expect(concat!("Unable to build class `", #class_name, "`"));
Expand Down