mirror of
https://codeberg.org/icewind/bitbuffer.git
synced 2026-06-03 16:44:06 +02:00
improve span handling a bit
This commit is contained in:
parent
a5206f06e4
commit
f96f44a590
1 changed files with 11 additions and 8 deletions
|
|
@ -5,7 +5,7 @@
|
||||||
//! # Examples
|
//! # Examples
|
||||||
//!
|
//!
|
||||||
//! ```
|
//! ```
|
||||||
//! use bitstream_reader_derive::Read;
|
//! use bitstream_reader_derive::BitRead;
|
||||||
//!
|
//!
|
||||||
//! #[derive(BitRead)]
|
//! #[derive(BitRead)]
|
||||||
//! struct TestStruct {
|
//! struct TestStruct {
|
||||||
|
|
@ -86,15 +86,16 @@ fn parse(data: &Data, struct_name: &Ident) -> TokenStream {
|
||||||
// Get attributes `#[..]` on each field
|
// Get attributes `#[..]` on each field
|
||||||
let size = get_field_size(f);
|
let size = get_field_size(f);
|
||||||
let field_type = &f.ty;
|
let field_type = &f.ty;
|
||||||
|
let span = f.span();
|
||||||
match size {
|
match size {
|
||||||
Some(size) => {
|
Some(size) => {
|
||||||
quote_spanned! { f.span() =>
|
quote_spanned! {span=>
|
||||||
let size: usize = #size;
|
let size: usize = #size;
|
||||||
let #name:#field_type = stream.read_sized(size)?;
|
let #name:#field_type = stream.read_sized(size)?;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
None => {
|
None => {
|
||||||
quote_spanned! { f.span() =>
|
quote_spanned! {span=>
|
||||||
let #name:#field_type = stream.read()?;
|
let #name:#field_type = stream.read()?;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -102,11 +103,12 @@ fn parse(data: &Data, struct_name: &Ident) -> TokenStream {
|
||||||
});
|
});
|
||||||
let struct_definition = fields.named.iter().map(|f| {
|
let struct_definition = fields.named.iter().map(|f| {
|
||||||
let name = &f.ident;
|
let name = &f.ident;
|
||||||
quote_spanned! { f.span() =>
|
quote_spanned! {f.span()=>
|
||||||
#name,
|
#name,
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
quote! {
|
let span = data.struct_token.span();
|
||||||
|
quote_spanned! {span=>
|
||||||
#(#definitions)*
|
#(#definitions)*
|
||||||
|
|
||||||
Ok(#struct_name {
|
Ok(#struct_name {
|
||||||
|
|
@ -122,16 +124,17 @@ fn parse(data: &Data, struct_name: &Ident) -> TokenStream {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_field_size(field: &Field) -> Option<TokenStream> {
|
fn get_field_size(field: &Field) -> Option<TokenStream> {
|
||||||
|
let span = field.span();
|
||||||
get_field_attr(field, "size")
|
get_field_attr(field, "size")
|
||||||
.map(|size_lit| match size_lit {
|
.map(|size_lit| match size_lit {
|
||||||
Lit::Int(size) => {
|
Lit::Int(size) => {
|
||||||
quote! {
|
quote_spanned! {span=>
|
||||||
#size
|
#size
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Lit::Str(size_field) => {
|
Lit::Str(size_field) => {
|
||||||
let size = Ident::new(&size_field.value(), Span::call_site());
|
let size = Ident::new(&size_field.value(), Span::call_site());
|
||||||
quote! {
|
quote_spanned! {span=>
|
||||||
#size as usize
|
#size as usize
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -139,7 +142,7 @@ fn get_field_size(field: &Field) -> Option<TokenStream> {
|
||||||
})
|
})
|
||||||
.or_else(|| {
|
.or_else(|| {
|
||||||
get_field_attr(field, "size_bits").map(|size_bits_lit| {
|
get_field_attr(field, "size_bits").map(|size_bits_lit| {
|
||||||
quote_spanned! { field.span() =>
|
quote_spanned! {span=>
|
||||||
stream.read_int::<usize>(#size_bits_lit)?
|
stream.read_int::<usize>(#size_bits_lit)?
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue