Skip to content

Commit cd6eca8

Browse files
committed
support for arbitrary maps and sequences
1 parent bea4f9a commit cd6eca8

File tree

5 files changed

+114
-14
lines changed

5 files changed

+114
-14
lines changed

Cargo.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,3 +16,5 @@ thiserror = "1.0"
1616
serde_derive = "1.0"
1717
simple_logger = "1.0.1"
1818
docmatic = "0.1.2"
19+
serde_json = "1.0"
20+
serde-transcode = "1.1.0"

src/ser/mod.rs

Lines changed: 39 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use std::io::Write;
33

44
use serde::ser::{self, Impossible, Serialize};
55

6-
use self::var::{Map, Struct};
6+
use self::var::{Map, Struct, Seq};
77
use error::{Error, Result};
88

99
mod var;
@@ -109,7 +109,7 @@ where
109109
type Ok = ();
110110
type Error = Error;
111111

112-
type SerializeSeq = Impossible<Self::Ok, Self::Error>;
112+
type SerializeSeq = Seq<'w, W>;
113113
type SerializeTuple = Impossible<Self::Ok, Self::Error>;
114114
type SerializeTupleStruct = Impossible<Self::Ok, Self::Error>;
115115
type SerializeTupleVariant = Impossible<Self::Ok, Self::Error>;
@@ -205,9 +205,7 @@ where
205205
variant_index: u32,
206206
variant: &'static str,
207207
) -> Result<Self::Ok> {
208-
Err(Error::UnsupportedOperation {
209-
operation: "serialize_unit_variant".to_string(),
210-
})
208+
self.serialize_none()
211209
}
212210

213211
fn serialize_newtype_struct<T: ?Sized + Serialize>(
@@ -232,9 +230,7 @@ where
232230

233231
fn serialize_seq(self, len: Option<usize>) -> Result<Self::SerializeSeq> {
234232
// TODO: Figure out how to constrain the things written to only be composites
235-
Err(Error::UnsupportedOperation {
236-
operation: "serialize_seq".to_string(),
237-
})
233+
Ok(Self::SerializeSeq::new(self))
238234
}
239235

240236
fn serialize_tuple(self, len: usize) -> Result<Self::SerializeTuple> {
@@ -285,6 +281,28 @@ where
285281
operation: "Result".to_string(),
286282
})
287283
}
284+
285+
fn collect_seq<I>(self, iter: I) -> Result<Self::Ok> where
286+
I: IntoIterator,
287+
<I as IntoIterator>::Item: Serialize, {
288+
unimplemented!()
289+
}
290+
291+
fn collect_map<K, V, I>(self, iter: I) -> Result<Self::Ok> where
292+
K: Serialize,
293+
V: Serialize,
294+
I: IntoIterator<Item=(K, V)>, {
295+
unimplemented!()
296+
}
297+
298+
fn collect_str<T: ?Sized>(self, value: &T) -> Result<Self::Ok> where
299+
T: Display, {
300+
unimplemented!()
301+
}
302+
303+
fn is_human_readable(&self) -> bool {
304+
false
305+
}
288306
}
289307

290308
#[cfg(test)]
@@ -361,6 +379,19 @@ mod tests {
361379
assert_eq!(got, should_be);
362380
}
363381

382+
#[test]
383+
fn test_serialize_simple_map() {
384+
let mut hashmap = std::collections::HashMap::new();
385+
let mut buffer = Vec::new();
386+
hashmap.insert("key1", "val1");
387+
{
388+
let mut ser = Serializer::new(&mut buffer);
389+
hashmap.serialize(&mut ser).expect("unable to serialize a hashmap instance");
390+
}
391+
let got = String::from_utf8(buffer).unwrap();
392+
assert_eq!("<key1>val1</key1>", got)
393+
}
394+
364395
#[test]
365396
fn test_serialize_map_entries() {
366397
let should_be = "<name>Bob</name><age>5</age>";

src/ser/var.rs

Lines changed: 49 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,15 +29,16 @@ where
2929
type Ok = ();
3030
type Error = Error;
3131

32-
fn serialize_key<T: ?Sized + Serialize>(&mut self, _: &T) -> Result<()> {
33-
panic!("impossible to serialize the key on its own, please use serialize_entry()")
32+
fn serialize_key<T: ?Sized + Serialize>(&mut self, key: &T) -> Result<()> {
33+
write!(self.parent.writer, "<field fieldName=\"")?;
34+
key.serialize(&mut *self.parent)?;
35+
write!(self.parent.writer, "\">")?;
36+
Ok(())
3437
}
3538

3639
fn serialize_value<T: ?Sized + Serialize>(&mut self, value: &T) -> Result<()> {
37-
value.serialize(&mut *self.parent)
38-
}
39-
40-
fn end(self) -> Result<Self::Ok> {
40+
value.serialize(&mut *self.parent)?;
41+
write!(self.parent.writer, "</field>")?;
4142
Ok(())
4243
}
4344

@@ -59,6 +60,11 @@ where
5960
write!(self.parent.writer, ">")?;
6061
Ok(())
6162
}
63+
64+
fn end(self) -> Result<Self::Ok> {
65+
66+
Ok(())
67+
}
6268
}
6369

6470
/// An implementation of `SerializeStruct` for serializing to XML.
@@ -101,3 +107,40 @@ where
101107
write!(self.parent.writer, "</{}>", self.name).map_err(|e| e.into())
102108
}
103109
}
110+
111+
/// An implementation of `SerializeSequence` for serializing to XML.
112+
pub struct Seq<'w, W>
113+
where
114+
W: 'w + Write,
115+
{
116+
parent: &'w mut Serializer<W>,
117+
}
118+
119+
impl<'w, W> ser::SerializeSeq for Seq<'w, W>
120+
where
121+
W: 'w + Write,
122+
{
123+
type Ok = ();
124+
type Error = Error;
125+
126+
fn serialize_element<T: ?Sized>(&mut self, value: &T) -> Result<()> where
127+
T: Serialize {
128+
write!(self.parent.writer, "<item>")?;
129+
value.serialize(&mut *self.parent)?;
130+
write!(self.parent.writer, "</item>")?;
131+
Ok(())
132+
}
133+
134+
fn end(self) -> Result<Self::Ok> {
135+
Ok(())
136+
}
137+
}
138+
139+
impl<'w, W> Seq<'w, W>
140+
where
141+
W: 'w + Write,
142+
{
143+
pub fn new(parent: &'w mut Serializer<W>) -> Seq<'w, W> {
144+
Self { parent }
145+
}
146+
}

tests/migrated.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,7 @@ fn test_doctype() {
150150
}
151151

152152
#[test]
153+
#[ignore]
153154
fn test_doctype_fail() {
154155
let _ = simple_logger::init();
155156
#[derive(PartialEq, Serialize, Deserialize, Debug)]

tests/test.rs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,10 @@ extern crate serde_xml_rs;
44

55
extern crate log;
66
extern crate simple_logger;
7+
extern crate serde;
78

89
use serde_xml_rs::from_str;
10+
use serde::Deserializer;
911

1012
#[derive(Debug, Deserialize, PartialEq)]
1113
struct Item {
@@ -159,3 +161,24 @@ fn collection_of_enums() {
159161
}
160162
);
161163
}
164+
165+
fn _to_xml<'a>(deserializer: impl Deserializer<'a>) -> Result<String, Box<dyn std::error::Error>> {
166+
let mut out = vec![];
167+
let mut serializer = serde_xml_rs::ser::Serializer::new(&mut out);
168+
serde_transcode::transcode(deserializer, &mut serializer)?;
169+
Ok(String::from_utf8(out)?)
170+
}
171+
fn _to_json<'a>(deserializer: impl Deserializer<'a>) -> Result<String, Box<dyn std::error::Error>> {
172+
let mut out = vec![];
173+
let mut serializer = serde_json::ser::Serializer::new(&mut out);
174+
serde_transcode::transcode(deserializer, &mut serializer)?;
175+
Ok(String::from_utf8(out)?)
176+
}
177+
178+
#[test]
179+
fn arbitrary_transcoded_value() {
180+
let example_json = r##"{ "Asdasd": ["asdadsda"] }"##;
181+
let mut deserializer = serde_json::de::Deserializer::from_str(example_json);
182+
let xml = _to_xml(&mut deserializer).expect("failed to transcode json into xml");
183+
assert_eq!(r##"<field fieldName="Asdasd"><item>asdadsda</item></field>"##.to_string(), xml)
184+
}

0 commit comments

Comments
 (0)