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}