Best way to parse an Option<T> based on the contents of the field itself #312
-
I have a field like this: I have a feeling that some combination of Thank you for this library and your work on it! |
Beta Was this translation helpful? Give feedback.
Answered by
sharksforarms
Jan 17, 2023
Replies: 1 comment 2 replies
-
In this case, use deku::prelude::*;
use std::convert::{TryFrom, TryInto};
#[derive(Debug, PartialEq, DekuRead, DekuWrite)]
struct DekuTest {
#[deku(map = "|field: i32| -> Result<_, DekuError> { if field != -2147483647 { Ok(Some(field)) } else { Ok(None) } }")]
retainer_id: Option<i32>
}
fn main() {
{
let test_data = (-2147483647i32).to_le_bytes();
let test_deku = DekuTest::try_from(test_data.as_slice()).unwrap();
assert_eq!(
DekuTest {
retainer_id: None,
},
test_deku
);
let test_deku: Vec<u8> = test_deku.try_into().unwrap();
assert!(test_deku.is_empty());
}
{
let test_data = (-12345i32).to_le_bytes();
let test_deku = DekuTest::try_from(test_data.as_slice()).unwrap();
assert_eq!(
DekuTest {
retainer_id: Some(-12345),
},
test_deku
);
let test_deku: Vec<u8> = test_deku.try_into().unwrap();
assert_eq!(test_data.to_vec(), test_deku);
}
} |
Beta Was this translation helpful? Give feedback.
2 replies
Answer selected by
lfrancke
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
In this case,
map
is how I would approach it since you're still reading the value, but transforming the result based on the value.skip
,cond
anddefault
can be used to completely bypass reading. Here we always want to read.