report which field a struct validation error occured in
This commit is contained in:
@@ -164,7 +164,22 @@ fn define_copy_struct(names: &Names, name: &witx::Id, s: &witx::StructDatatype)
|
|||||||
let member_valids = s.member_layout().into_iter().map(|ml| {
|
let member_valids = s.member_layout().into_iter().map(|ml| {
|
||||||
let type_ = names.type_ref(&ml.member.tref);
|
let type_ = names.type_ref(&ml.member.tref);
|
||||||
let offset = ml.offset as u32;
|
let offset = ml.offset as u32;
|
||||||
quote!( #type_::validate(&ptr.cast(#offset)?)?; )
|
let fieldname = names.struct_member(&ml.member.name);
|
||||||
|
quote! {
|
||||||
|
#type_::validate(
|
||||||
|
&ptr.cast(#offset).map_err(|e|
|
||||||
|
::memory::GuestError::InField{
|
||||||
|
typename: stringify!(#ident).to_owned(),
|
||||||
|
field: stringify!(#fieldname).to_owned(),
|
||||||
|
err: Box::new(e),
|
||||||
|
})?
|
||||||
|
).map_err(|e|
|
||||||
|
::memory::GuestError::InField {
|
||||||
|
typename: stringify!(#ident).to_owned(),
|
||||||
|
field: stringify!(#fieldname).to_owned(),
|
||||||
|
err: Box::new(e),
|
||||||
|
})?;
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
quote! {
|
quote! {
|
||||||
@@ -235,7 +250,22 @@ fn define_ptr_struct(names: &Names, name: &witx::Id, s: &witx::StructDatatype) -
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
let offset = ml.offset as u32;
|
let offset = ml.offset as u32;
|
||||||
quote!( #type_::validate(&ptr.cast(#offset)?)?; )
|
let fieldname = names.struct_member(&ml.member.name);
|
||||||
|
quote! {
|
||||||
|
#type_::validate(
|
||||||
|
&ptr.cast(#offset).map_err(|e|
|
||||||
|
::memory::GuestError::InField{
|
||||||
|
typename: stringify!(#ident).to_owned(),
|
||||||
|
field: stringify!(#fieldname).to_owned(),
|
||||||
|
err: Box::new(e),
|
||||||
|
})?
|
||||||
|
).map_err(|e|
|
||||||
|
::memory::GuestError::InField {
|
||||||
|
typename: stringify!(#ident).to_owned(),
|
||||||
|
field: stringify!(#fieldname).to_owned(),
|
||||||
|
err: Box::new(e),
|
||||||
|
})?;
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
let member_reads = s.member_layout().into_iter().map(|ml| {
|
let member_reads = s.member_layout().into_iter().map(|ml| {
|
||||||
|
|||||||
@@ -11,4 +11,11 @@ pub enum GuestError {
|
|||||||
PtrNotAligned(Region, u32),
|
PtrNotAligned(Region, u32),
|
||||||
#[error("Pointer already borrowed: {0:?}")]
|
#[error("Pointer already borrowed: {0:?}")]
|
||||||
PtrBorrowed(Region),
|
PtrBorrowed(Region),
|
||||||
|
#[error("In {typename}.{field}:")]
|
||||||
|
InField {
|
||||||
|
typename: String,
|
||||||
|
field: String,
|
||||||
|
#[source]
|
||||||
|
err: Box<GuestError>,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user