context/
context.rs

1use binmarshal::*;
2
3struct MyContext {
4  variant: u8,
5  inner: u8
6}
7
8struct Var4Context {
9  variant: u8
10}
11
12#[derive(Debug, Clone, PartialEq, Marshal, Demarshal, MarshalUpdate)]
13#[marshal(ctx = Var4Context, tag = "ctx.variant")]
14enum Var4Inner {
15  #[marshal(tag = "1")]
16  Variant1,
17  #[marshal(tag = "2")]
18  Variant2(u8, u16),
19  #[marshal(tag = "3")]
20  Variant3,
21}
22
23#[derive(Debug, Clone, PartialEq, Marshal, Demarshal, MarshalUpdate)]
24#[marshal(ctx = MyContext, tag = "ctx.variant")]
25enum MyEnum {
26  #[marshal(tag = "1")]
27  Variant1,
28  #[marshal(tag = "2")]
29  Variant2,
30  #[marshal(tag = "3")]
31  Variant3,
32  #[marshal(tag = "4")]
33  Variant4 {
34    #[marshal(ctx = "construct", ctx_type = Var4Context, ctx_member(field = "variant", member = "ctx.inner"))]
35    inner: Var4Inner
36  }
37}
38
39#[derive(Debug, Clone, PartialEq, Marshal, Demarshal, MarshalUpdate)]
40#[marshal(ctx = MyContext)]
41struct InnerStruct {
42  #[marshal(ctx = "forward")]
43  en: MyEnum
44}
45
46#[derive(Debug, Clone, PartialEq, Marshal, Demarshal, MarshalUpdate)]
47struct MyStruct {
48  which_variant: u8,
49  which_inner_variant: u8,
50  #[marshal(ctx = "construct", ctx_type = MyContext, ctx_member(field = "variant", member = "which_variant"), ctx_member(field = "inner", member = "which_inner_variant"))]
51  inner: InnerStruct
52}
53
54fn main() {
55  let mut v = MyStruct {
56    which_variant: 0,
57    which_inner_variant: 0,
58    inner: InnerStruct {
59      en: MyEnum::Variant4 { inner: Var4Inner::Variant2(131, 4213) }
60    }
61  };
62
63  v.update(&mut ());
64
65  assert_eq!(v.which_variant, 4);
66  assert_eq!(v.which_inner_variant, 2);
67
68  let mut bytes = [0u8; 256];
69  let mut writer = BufferBitWriter::new(&mut bytes);
70  assert!(v.clone().write(&mut writer, ()).is_ok());
71
72  let slice = writer.slice();
73  assert_eq!(slice.len(), 5);
74
75  let v2 = MyStruct::read(&mut BitView::new(slice), ());
76  assert!(matches!(v2, Ok(v2) if v2 == v));
77}