Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 060ea95e authored by Martin Geisler's avatar Martin Geisler
Browse files

pdl: move ‘generate_field_getter’ to ‘Field’

Test: atest pdl_tests pdl_inline_tests
Change-Id: Ib4ff14eb44b9b4384e6c69c2d15410060eaa6925
parent b79be8fa
Loading
Loading
Loading
Loading
+1 −18
Original line number Diff line number Diff line
@@ -31,23 +31,6 @@ macro_rules! quote_block {
    }
}

fn generate_field_getter(packet_name: &syn::Ident, field: &ast::Field) -> proc_macro2::TokenStream {
    let field_name = Field::from(field).get_ident();
    match field {
        ast::Field::Scalar { id, width, .. } => {
            // TODO(mgeisler): refactor with generate_field above.
            let getter_name = format_ident!("get_{id}");
            let field_type = types::Integer::new(*width);
            quote! {
                pub fn #getter_name(&self) -> #field_type {
                    self.#packet_name.as_ref().#field_name
                }
            }
        }
        _ => todo!("unsupported field: {:?}", field),
    }
}

/// Find byte indices covering `offset..offset+width` bits.
fn get_field_range(offset: usize, width: usize) -> std::ops::Range<usize> {
    let start = offset / 8;
@@ -480,7 +463,7 @@ fn generate_packet_decl(
            }
        }
    });
    let field_getters = fields.iter().map(|field| generate_field_getter(&ident, field));
    let field_getters = fields.iter().map(|field| Field::from(field).generate_getter(&ident));
    code.push_str(&quote_block! {
        impl #packet_name {
            pub fn parse(bytes: &[u8]) -> Result<Self> {
+17 −0
Original line number Diff line number Diff line
@@ -30,6 +30,17 @@ impl ScalarField {
            #visibility #field_name: #field_type
        }
    }

    fn generate_getter(&self, packet_name: &syn::Ident) -> proc_macro2::TokenStream {
        let field_name = self.get_ident();
        let getter_name = format_ident!("get_{}", self.id);
        let field_type = types::Integer::new(self.width);
        quote! {
            pub fn #getter_name(&self) -> #field_type {
                self.#packet_name.as_ref().#field_name
            }
        }
    }
}

/// Projection of [`ast::Field`] with the bits needed for the Rust
@@ -66,4 +77,10 @@ impl Field {
            Field::Scalar(field) => field.generate_decl(visibility),
        }
    }

    pub fn generate_getter(&self, packet_name: &syn::Ident) -> proc_macro2::TokenStream {
        match self {
            Field::Scalar(field) => field.generate_getter(packet_name),
        }
    }
}