fix: new method

This commit is contained in:
Kristofers Solo 2025-10-04 18:51:16 +03:00
parent 13e518c4e5
commit ab1c0e4ad9
Signed by: kristoferssolo
GPG Key ID: 8687F2D3EEE6F0ED

View File

@ -7,11 +7,11 @@ pub fn generate_impl(info: &Struct) -> TokenStream {
let name = &info.name; let name = &info.name;
let inner = &info.body; let inner = &info.body;
let error = generate_error(info);
let conversions = generate_conversions(info);
let ops = generate_bitwise_ops(info); let ops = generate_bitwise_ops(info);
let fmt = generate_bitwise_fmt(info); let fmt = generate_bitwise_fmt(info);
let wrapper = generate_bitwise_wrapper(info); let wrapper = generate_bitwise_wrapper(info);
let error = generate_error(info);
let conversions = generate_conversions(info);
quote! { quote! {
#error #error
@ -85,8 +85,8 @@ fn generate_conversions(info: &Struct) -> TokenStream {
} }
fn generate_error(info: &Struct) -> TokenStream { fn generate_error(info: &Struct) -> TokenStream {
let error_type = &info.error_type;
let name = &info.name; let name = &info.name;
let error_type = &info.error_type;
let inner = &info.body; let inner = &info.body;
quote! { quote! {
@ -99,14 +99,6 @@ fn generate_error(info: &Struct) -> TokenStream {
width: u8 width: u8
}, },
#[error("Hex value 0x{value:X} exceeds {bit_width}-bit limit (masked to 0x{masked:0width$X})")]
ExceedsBitLimit {
value: u64,
bit_width: u8,
masked: u64,
width: usize,
},
#[error("Failed to parse subkey value: {0}")] #[error("Failed to parse subkey value: {0}")]
ParseError(#[from] std::num::ParseIntError), ParseError(#[from] std::num::ParseIntError),
@ -164,6 +156,12 @@ fn generate_bitwise_ops(info: &Struct) -> TokenStream {
let error_type = &info.error_type; let error_type = &info.error_type;
let bit_width = info.bit_width; let bit_width = info.bit_width;
let inner_type_width = match inner.to_string().as_str() {
"u8" => 8,
"u16" => 16,
"u32" => 32,
_ => 64,
};
let hex_width = usize::from(bit_width.div_ceil(4)); let hex_width = usize::from(bit_width.div_ceil(4));
let bin_width = usize::from(bit_width); let bin_width = usize::from(bit_width);
@ -173,6 +171,26 @@ fn generate_bitwise_ops(info: &Struct) -> TokenStream {
(1u64 << (bit_width)) - 1 (1u64 << (bit_width)) - 1
}; };
let new_method = if bit_width == inner_type_width {
quote! {
/// Create a new [`Self`] from a key value
#[inline]
#[macro_use]
pub fn new(key: #inner) -> Self {
key.into()
}
}
} else {
quote! {
/// Create a new [`Self`] from a key value
#[inline]
#[macro_use]
pub fn new(key: #inner) -> Result<Self, #error_type> {
key.try_into()
}
}
};
quote! { quote! {
impl #name { impl #name {
/// The bit width of this type /// The bit width of this type
@ -184,12 +202,7 @@ fn generate_bitwise_ops(info: &Struct) -> TokenStream {
/// Maximum value for this bit width /// Maximum value for this bit width
pub const MAX: #inner = #max_value; pub const MAX: #inner = #max_value;
/// Create a new [`Self`] from a key value #new_method
#[inline]
#[macro_use]
pub fn new(key: #inner) -> Result<Self, #error_type> {
key.try_into()
}
/// Convert to hex string (formatted for the bit width) /// Convert to hex string (formatted for the bit width)
#[macro_use] #[macro_use]
@ -364,12 +377,7 @@ fn generate_bitwise_ops(info: &Struct) -> TokenStream {
let masked = value & Self::MAX; let masked = value & Self::MAX;
if value != masked { if value != masked {
return Err(#error_type::ExceedsBitLimit { return Err(#error_type::value_out_of_range(value));
value,
bit_width: Self::BIT_WIDTH,
masked,
width: #hex_width
})
} }
Ok(Self(value)) Ok(Self(value))