Change the representation of Enums
Maintainers usually reply within 1 day
Nobody has claimed this yet.
Assessment
- Difficulty
- 5/5
- Estimated time
- Over a week
- Newbie friendliness
- 25/100
- Issue type
- Feature
- Clarity
- Clearly specified
- Activity status
- Stale
- Tech stack
- rust
Research direction
Start with the Serde serialization code that handles enum variants; the issue does not name a file or test. Compare the requested XML representations with the existing enum handling and check how deserialization reads them. Done means unit, newtype, tuple, and struct variants serialize and round-trip as described.
Written by the indexing model from the issue text.
Description
serde_json supports enums:
| Kind | Enum field |
|---|---|
| Unit | "field": "Unit", |
| Newtype | "field": { "Newtype": 42 }, |
| Tuple | "field": { "Tuple": [42, "answer"] }, |
| Struct | "field": { "Struct": {"q": 42, "a":"answer"} }, |
enum Kinds { // Enum name as:
Unit, // Value
Newtype(i32), // Key
Tuple((i32, String)), // Key
Struct(MyStruct), // Key
}
https://docs.rs/quick-xml/latest/quick_xml/de/index.html#normal-enum-variant
so quick-xml should too:
| Kind | Enum field |
|---|---|
| Unit | <field>Unit</field> |
| Newtype | <field><Newtype>42</Newtype></field> |
| Tuple | <field><Tuple>42</Tuple><Tuple>answer</Tuple></field> |
| Struct | <field><Struct><q>42</q><a>answer</a></Struct></field> |
enum Kinds { // Enum name as:
Unit, // Value
Newtype(i32), // Tag
Tuple((i32, String)), // Tag
Struct(MyStruct), // Tag
}
Currently the above XML won't be generated (gives an error) while JSON would even parse back into Rust enum.
Unsupported operation: cannot serialize enum newtype variant
[Details] Ser/deserialization of enum - crate comparison:
// [package]
// name = "xml_vs_json"
// version = "0.1.0"
// edition = "2021"
// [dependencies]
// eyre = "0.6.12"
// quick-xml = { version = "0.31.0", features = ["serde", "serialize"] }
// rmp-serde = "1.1.2"
// serde = { version = "1.0.197", features = ["derive"] }
// serde_json = "1.0.114"
// serde_yaml = "0.9.32"
// toml = "0.8.10"
use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize, Eq, PartialEq, Debug)]
pub struct MyStruct {
pub i8_value: i8,
pub choice_value: MyChoice,
pub choice_list: Vec<MyChoice>,
}
#[derive(Serialize, Deserialize, Eq, PartialEq, Debug)]
pub enum MyChoice {
ChoiceA(MyChoiceA),
ChoiceB(MyChoiceB),
}
#[derive(Serialize, Deserialize, Eq, PartialEq, Debug)]
pub struct MyChoiceA {
pub choice_i32: i32,
}
#[derive(Serialize, Deserialize, Eq, PartialEq, Debug)]
pub struct MyChoiceB {
pub choice_i64: i64,
pub choice_text: String,
}
fn main() {
let result = run();
if let Err(err) = result {
println!("err: {err}");
}
}
fn run() -> eyre::Result<()> {
let a = MyStruct {
i8_value: 8,
choice_value: MyChoice::ChoiceA(MyChoiceA { choice_i32: 32 }),
choice_list: vec![
MyChoice::ChoiceA(MyChoiceA { choice_i32: 32 }),
MyChoice::ChoiceB(MyChoiceB {
choice_i64: 64,
choice_text: "my text".to_string(),
}),
MyChoice::ChoiceA(MyChoiceA { choice_i32: 32 }),
],
};
try_reencode_all(&a)?;
Ok(())
}
fn try_reencode_all(a: &MyStruct) -> eyre::Result<()> {
// pass
let a_json = reencode_json(&a)?;
assert_eq!(a, &a_json);
// pass
let a_toml = reencode_toml(&a)?;
assert_eq!(a, &a_toml);
// pass
let a_yaml = reencode_yaml(&a)?;
assert_eq!(a, &a_yaml);
// pass
let a_msgpack = reencode_msgpack(&a)?;
assert_eq!(a, &a_msgpack);
// fail: Unsupported operation: cannot serialize enum newtype variant `MyChoice::ChoiceA`
let a_qxml = reencode_quick_xml(&a)?;
assert_eq!(a, &a_qxml);
Ok(())
}
fn reencode_json(input: &MyStruct) -> eyre::Result<MyStruct> {
let json_str: String = serde_json::to_string(&input)?;
println!("serde_json: {json_str}");
let output = serde_json::from_str(&json_str)?;
Ok(output)
}
fn reencode_toml(input: &MyStruct) -> eyre::Result<MyStruct> {
let toml_str: String = toml::to_string(&input)?;
println!("toml: {toml_str}");
let output = toml::from_str(&toml_str)?;
Ok(output)
}
fn reencode_yaml(input: &MyStruct) -> eyre::Result<MyStruct> {
let yaml_str: String = serde_yaml::to_string(&input)?;
println!("yaml: {yaml_str}");
let output = serde_yaml::from_str(&yaml_str)?;
Ok(output)
}
fn reencode_msgpack(input: &MyStruct) -> eyre::Result<MyStruct> {
let msgpack_bytes: Vec<u8> = rmp_serde::to_vec(&input)?;
println!("rmp_serde: {msgpack_bytes:?}");
let output = rmp_serde::from_slice(&msgpack_bytes)?;
Ok(output)
}
fn reencode_quick_xml(input: &MyStruct) -> eyre::Result<MyStruct> {
// serialization does not work
let qxml_str: String = quick_xml::se::to_string(&input)?;
println!("quick_xml::se: {qxml_str}");
let output = quick_xml::de::from_str(&qxml_str)?;
Ok(output)
}
- Dominant language
- Rust
- Stars
- 1.6k
- Forks
- 299
- Avg merge
- 2d 4h
- Merged PRs (30d)
- 9
Getting set up
- No Dockerfile or Docker Compose file
- No pull request template
- Read the contributing guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from tafia/quick-xml
-
Parser accepts an empty element or attribute namePossibly taken @ychampion claimed this today. Open
Difficulty 2/5 1-3 hours Newbie friendliness 68/100
Maintainers usually reply within 1 day
-
DecodingReader::set_encoding panics when the XML declaration is longer than 64 bytesPossibly taken @emschwartz claimed this 4 days ago. Openbug encoding
Difficulty 4/5 3-5 days Newbie friendliness 30/100
tafia/quick-xml#1040 · 1 comment ·
Maintainers usually reply within 1 day
-
encoding optimization
Difficulty 4/5 3-5 days Newbie friendliness 55/100
tafia/quick-xml#1039 · 1 comment ·
Maintainers usually reply within 1 day
-
optimization question
Difficulty 4/5 3-5 days Newbie friendliness 52/100
Maintainers usually reply within 1 day
-
enhancement
Difficulty 4/5 1-2 days Newbie friendliness 53/100
tafia/quick-xml#1035 · 1 comment ·
Maintainers usually reply within 1 day
Similar issues
-
bug
Difficulty 2/5 1-3 hours Newbie friendliness 82/100
storytold/photocraft#14822 ·
Maintainers usually reply within 1 day
-
bug css
Difficulty 2/5 1-3 hours Newbie friendliness 66/100
dginev/latexml-oxide#853 ·
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 62/100
Maintainers usually reply within 2 days
-
[Bug] export_build_environment admits its output directory only after the export ran in the build computerPossibly taken @viniciusdsandrade claimed this today. Open
Difficulty 2/5 1-3 hours Newbie friendliness 62/100
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
Maintainers usually reply within 1 day