-
-
Notifications
You must be signed in to change notification settings - Fork 55
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
update attribute not working on internal struct? #369
Comments
Recursive update seems like a good thing to add. Anyway, here is the "requires Clone + Copy and is really just a hack" code you can use: #[derive(Debug, PartialEq, DekuRead, DekuWrite, Clone, Copy)]
struct IpAddr {
#[deku(update = "9")]
a: u8,
b: u8,
c: u8,
d: u8,
}
#[derive(Debug, PartialEq, DekuRead, DekuWrite)]
struct Container {
#[deku(update = "{ let mut a = self.ip_addr; a.update()?; a }")]
ip_addr: IpAddr,
} |
This works for this case, however I also have a Vec in the relevant structure, and for this to work it is required for IpAddr implement Clone and Copy, but Vec doesn't implement Copy, so it can't work. Is there a way to bypass it? What I did was to simply implement my own update function on Container that calls the IpAddr update. Not sure why the update through Deku requires IpAddr to implement Copy when my own function doesn't (maybe because it accepts &mut self) |
impl DekuUpdate for Container {
fn update(&mut self) -> core::result::Result<(), ::deku::DekuError> {
use core::convert::TryInto;
self
.ip_addr = ({
let mut a = self.ip_addr;
a.update()?;
a
})
.try_into()?;
Ok(())
}
} There isn't a reason that deku couldn't in the future support emitting this: impl DekuUpdate for Container {
fn update(&mut self) -> core::result::Result<(), ::deku::DekuError> {
self.ip_addr.update()?;
Ok(())
}
} Maybe allow an empty #[derive(Debug, PartialEq, DekuRead, DekuWrite)]
struct Container {
#[deku(update)]
ip_addr: IpAddr,
} |
I'm trying to use update, and in my tests it doesn't run on internal structs, it works only on top level. Is there a way to get it working also on internal structs? I can manually run it on the internal field but it means I need to know the implementation details while I'd like all updates to propagate through the container structure.
Here is my test code:
This is the output it generated:
As seen, the update doesn't run in the second case
The text was updated successfully, but these errors were encountered: