Skip to content

Commit

Permalink
[#36] Add parse_struct_field()
Browse files Browse the repository at this point in the history
  • Loading branch information
Orchaldir committed Sep 10, 2023
1 parent 1cbdf45 commit bdd5a85
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 3 deletions.
17 changes: 16 additions & 1 deletion macro_ui/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,7 @@ fn visit_enum_variants(data: &DataEnum) -> TokenStream2 {

fn handle_struct(name: &Ident, fields: &FieldsNamed) -> TokenStream2 {
let visited_fields: TokenStream2 = fields.named.iter().map(visit_struct_field).collect();
let parsed_fields: TokenStream2 = fields.named.iter().map(parse_struct_field).collect();

quote! {
#[automatically_derived]
Expand All @@ -128,7 +129,9 @@ fn handle_struct(name: &Ident, fields: &FieldsNamed) -> TokenStream2 {
impl #name {
fn parse(parser: &dyn UiParser, path: &str, spaces: &str) -> #name {
println!("{}Parse struct {} with path '{}'", spaces, stringify!(#name), path);
#name::default()
Self {
#parsed_fields
}
}
}
}
Expand All @@ -152,6 +155,18 @@ fn visit_struct_field(field: &Field) -> TokenStream2 {
}
}

fn parse_struct_field(field: &Field) -> TokenStream2 {
let field_name = &field.ident;

if is_integer(field) {
quote! {
#field_name: parser.parse_u32(&format!("{}.{}", path, stringify!(#field_name))),
}
} else {
quote! {}
}
}

fn visit_tuple_field(field: &Field, field_name: &str) -> TokenStream2 {
if is_integer(field) {
quote! {
Expand Down
12 changes: 10 additions & 2 deletions rpg_tools_core/src/ui/parser.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,12 @@
pub trait UiParser {
/// Parse a string from a path.
fn get_str<'a>(&self, name: &str) -> &'a str;
}
fn get_str<'a>(&self, name: &str) -> Option<&'a str>;

/// Parse an integer from a path.
fn parse_u32(&self, path: &str) -> Option<u32> {
self.get_str(path)
.iter()
.flat_map(|s| s.parse::<u32>().ok())
.next()
}
}

0 comments on commit bdd5a85

Please sign in to comment.