Skip to main content

debug_2010/
debug_2010.rs

1//! Debug script for issue 2010
2
3use facet::Facet;
4use std::collections::HashMap;
5
6#[derive(Clone, Debug, Facet, PartialEq)]
7#[facet(tag = "kind")]
8#[repr(C)]
9pub enum Inner {
10    TypeA { value: f64 },
11    TypeB { alpha: f64, beta: f64 },
12}
13
14#[derive(Clone, Debug, Facet, PartialEq)]
15pub struct Item {
16    #[facet(flatten)]
17    pub inner: Inner,
18    pub extra: Option<String>,
19}
20
21#[derive(Clone, Debug, Facet, PartialEq)]
22pub struct Container {
23    pub items: Option<HashMap<String, Item>>,
24}
25
26#[derive(Clone, Debug, Facet, PartialEq)]
27pub struct Outer {
28    pub container: Container,
29}
30
31fn main() {
32    // Simpler test - just Item directly
33    println!("=== Test 1: Item directly, tag first ===");
34    let json1 = r#"{"kind": "TypeB", "alpha": 1.0, "beta": 2.0, "extra": "test"}"#;
35    match facet_json::from_str::<Item>(json1) {
36        Ok(item) => println!("OK: {:?}", item),
37        Err(e) => println!("ERR: {:?}", e),
38    }
39
40    println!("\n=== Test 2: Item directly, tag in middle ===");
41    let json2 = r#"{"alpha": 1.0, "kind": "TypeB", "beta": 2.0, "extra": "test"}"#;
42    match facet_json::from_str::<Item>(json2) {
43        Ok(item) => println!("OK: {:?}", item),
44        Err(e) => println!("ERR: {:?}", e),
45    }
46
47    println!("\n=== Test 3: Item directly, tag last ===");
48    let json3 = r#"{"alpha": 1.0, "beta": 2.0, "extra": "test", "kind": "TypeB"}"#;
49    match facet_json::from_str::<Item>(json3) {
50        Ok(item) => println!("OK: {:?}", item),
51        Err(e) => println!("ERR: {:?}", e),
52    }
53
54    println!("\n=== Test 4: HashMap<String, Item>, tag first ===");
55    let json4 = r#"{"x": {"kind": "TypeB", "alpha": 1.0, "beta": 2.0, "extra": "test"}}"#;
56    match facet_json::from_str::<HashMap<String, Item>>(json4) {
57        Ok(map) => println!("OK: {:?}", map),
58        Err(e) => println!("ERR: {:?}", e),
59    }
60
61    println!("\n=== Test 5: HashMap<String, Item>, tag in middle ===");
62    let json5 = r#"{"x": {"alpha": 1.0, "kind": "TypeB", "beta": 2.0, "extra": "test"}}"#;
63    match facet_json::from_str::<HashMap<String, Item>>(json5) {
64        Ok(map) => println!("OK: {:?}", map),
65        Err(e) => println!("ERR: {:?}", e),
66    }
67
68    println!("\n=== Test 6: Full Outer struct, tag first ===");
69    let json6 = r#"{
70        "container": {
71            "items": {
72                "x": {
73                    "kind": "TypeB",
74                    "alpha": 1.0,
75                    "beta": 2.0,
76                    "extra": "test"
77                }
78            }
79        }
80    }"#;
81    match facet_json::from_str::<Outer>(json6) {
82        Ok(outer) => println!("OK: {:?}", outer),
83        Err(e) => println!("ERR: {:?}", e),
84    }
85
86    println!("\n=== Test 7: Full Outer struct, tag in middle ===");
87    let json7 = r#"{
88        "container": {
89            "items": {
90                "x": {
91                    "alpha": 1.0,
92                    "extra": "test",
93                    "kind": "TypeB",
94                    "beta": 2.0
95                }
96            }
97        }
98    }"#;
99    match facet_json::from_str::<Outer>(json7) {
100        Ok(outer) => println!("OK: {:?}", outer),
101        Err(e) => println!("ERR: {:?}", e),
102    }
103
104    // Narrow down - is it Option<HashMap> or just HashMap in Container?
105    println!("\n=== Test 8: Container directly, tag first ===");
106    let json8 =
107        r#"{"items": {"x": {"kind": "TypeB", "alpha": 1.0, "beta": 2.0, "extra": "test"}}}"#;
108    match facet_json::from_str::<Container>(json8) {
109        Ok(c) => println!("OK: {:?}", c),
110        Err(e) => println!("ERR: {:?}", e),
111    }
112
113    println!("\n=== Test 9: Container directly, tag in middle ===");
114    let json9 =
115        r#"{"items": {"x": {"alpha": 1.0, "kind": "TypeB", "beta": 2.0, "extra": "test"}}}"#;
116    match facet_json::from_str::<Container>(json9) {
117        Ok(c) => println!("OK: {:?}", c),
118        Err(e) => println!("ERR: {:?}", e),
119    }
120
121    // Without Option
122    #[derive(Clone, Debug, Facet, PartialEq)]
123    pub struct ContainerNoOption {
124        pub items: HashMap<String, Item>,
125    }
126
127    println!("\n=== Test 10: ContainerNoOption, tag first ===");
128    let json10 =
129        r#"{"items": {"x": {"kind": "TypeB", "alpha": 1.0, "beta": 2.0, "extra": "test"}}}"#;
130    match facet_json::from_str::<ContainerNoOption>(json10) {
131        Ok(c) => println!("OK: {:?}", c),
132        Err(e) => println!("ERR: {:?}", e),
133    }
134
135    println!("\n=== Test 11: ContainerNoOption, tag in middle ===");
136    let json11 =
137        r#"{"items": {"x": {"alpha": 1.0, "kind": "TypeB", "beta": 2.0, "extra": "test"}}}"#;
138    match facet_json::from_str::<ContainerNoOption>(json11) {
139        Ok(c) => println!("OK: {:?}", c),
140        Err(e) => println!("ERR: {:?}", e),
141    }
142
143    // Outer without Option
144    #[derive(Clone, Debug, Facet, PartialEq)]
145    pub struct OuterNoOption {
146        pub container: ContainerNoOption,
147    }
148
149    println!("\n=== Test 12: OuterNoOption, tag first ===");
150    let json12 = r#"{"container": {"items": {"x": {"kind": "TypeB", "alpha": 1.0, "beta": 2.0, "extra": "test"}}}}"#;
151    match facet_json::from_str::<OuterNoOption>(json12) {
152        Ok(o) => println!("OK: {:?}", o),
153        Err(e) => println!("ERR: {:?}", e),
154    }
155
156    println!("\n=== Test 13: OuterNoOption, tag in middle ===");
157    let json13 = r#"{"container": {"items": {"x": {"alpha": 1.0, "kind": "TypeB", "beta": 2.0, "extra": "test"}}}}"#;
158    match facet_json::from_str::<OuterNoOption>(json13) {
159        Ok(o) => println!("OK: {:?}", o),
160        Err(e) => println!("ERR: {:?}", e),
161    }
162
163    // Maybe it's specific to Outer wrapping Container with Option<HashMap>
164    // Let's try Outer2 wrapping Container (which has Option<HashMap>)
165    #[derive(Clone, Debug, Facet, PartialEq)]
166    pub struct Outer2 {
167        pub c: Container,
168    }
169
170    println!("\n=== Test 14: Outer2 with Container (Option<HashMap>), tag first ===");
171    let json14 =
172        r#"{"c": {"items": {"x": {"kind": "TypeB", "alpha": 1.0, "beta": 2.0, "extra": "test"}}}}"#;
173    match facet_json::from_str::<Outer2>(json14) {
174        Ok(o) => println!("OK: {:?}", o),
175        Err(e) => println!("ERR: {:?}", e),
176    }
177
178    println!("\n=== Test 15: Outer2 with Container (Option<HashMap>), tag in middle ===");
179    let json15 =
180        r#"{"c": {"items": {"x": {"alpha": 1.0, "kind": "TypeB", "beta": 2.0, "extra": "test"}}}}"#;
181    match facet_json::from_str::<Outer2>(json15) {
182        Ok(o) => println!("OK: {:?}", o),
183        Err(e) => println!("ERR: {:?}", e),
184    }
185}