mirror of
https://github.com/pezkuwichain/serde.git
synced 2026-04-26 10:57:55 +00:00
Fix serializing json enums
This commit is contained in:
+40
-6
@@ -47,12 +47,6 @@ impl<'a, W: io::Write> ser::Visitor for Visitor<'a, W> {
|
||||
type Value = ();
|
||||
type Error = io::Error;
|
||||
|
||||
#[inline]
|
||||
fn visit_unit(&mut self) -> io::Result<()> {
|
||||
try!(self.writer.write(b"null"));
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn visit_bool(&mut self, value: bool) -> io::Result<()> {
|
||||
if value {
|
||||
@@ -145,6 +139,20 @@ impl<'a, W: io::Write> ser::Visitor for Visitor<'a, W> {
|
||||
value.visit(self)
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn visit_unit(&mut self) -> io::Result<()> {
|
||||
try!(self.writer.write(b"null"));
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn visit_enum_unit(&mut self, _name: &str, variant: &str) -> io::Result<()> {
|
||||
try!(self.writer.write(b"{"));
|
||||
try!(self.visit_str(variant));
|
||||
try!(self.writer.write(b":[]}"));
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn visit_seq<V>(&mut self, mut visitor: V) -> io::Result<()>
|
||||
where V: ser::SeqVisitor,
|
||||
@@ -157,6 +165,19 @@ impl<'a, W: io::Write> ser::Visitor for Visitor<'a, W> {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn visit_enum_seq<V>(&mut self, _name: &str, variant: &str, visitor: V) -> io::Result<()>
|
||||
where V: ser::SeqVisitor,
|
||||
{
|
||||
try!(self.writer.write(b"{"));
|
||||
try!(self.visit_str(variant));
|
||||
try!(self.writer.write(b":"));
|
||||
try!(self.visit_seq(visitor));
|
||||
try!(self.writer.write(b"}"));
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn visit_seq_elt<T>(&mut self, first: bool, value: T) -> io::Result<()>
|
||||
where T: ser::Serialize,
|
||||
@@ -181,6 +202,19 @@ impl<'a, W: io::Write> ser::Visitor for Visitor<'a, W> {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn visit_enum_map<V>(&mut self, _name: &str, variant: &str, visitor: V) -> io::Result<()>
|
||||
where V: ser::MapVisitor,
|
||||
{
|
||||
try!(self.writer.write(b"{"));
|
||||
try!(self.visit_str(variant));
|
||||
try!(self.writer.write(b":"));
|
||||
try!(self.visit_map(visitor));
|
||||
try!(self.writer.write(b"}"));
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn visit_map_elt<K, V>(&mut self, first: bool, key: K, value: V) -> io::Result<()>
|
||||
where K: ser::Serialize,
|
||||
|
||||
@@ -193,6 +193,26 @@ impl ser::Visitor for Serializer {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn visit_enum_seq<V>(&mut self, _name: &str, variant: &str, visitor: V) -> Result<(), ()>
|
||||
where V: ser::SeqVisitor,
|
||||
{
|
||||
try!(self.visit_seq(visitor));
|
||||
|
||||
let value = match self.state.pop().unwrap() {
|
||||
State::Value(value) => value,
|
||||
_ => panic!(),
|
||||
};
|
||||
|
||||
let mut object = BTreeMap::new();
|
||||
|
||||
object.insert(variant.to_string(), value);
|
||||
|
||||
self.state.push(State::Value(Value::Object(object)));
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn visit_seq_elt<T>(&mut self, _first: bool, value: T) -> Result<(), ()>
|
||||
where T: ser::Serialize,
|
||||
@@ -232,6 +252,26 @@ impl ser::Visitor for Serializer {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn visit_enum_map<V>(&mut self, _name: &str, variant: &str, visitor: V) -> Result<(), ()>
|
||||
where V: ser::MapVisitor,
|
||||
{
|
||||
try!(self.visit_map(visitor));
|
||||
|
||||
let value = match self.state.pop().unwrap() {
|
||||
State::Value(value) => value,
|
||||
_ => panic!(),
|
||||
};
|
||||
|
||||
let mut object = BTreeMap::new();
|
||||
|
||||
object.insert(variant.to_string(), value);
|
||||
|
||||
self.state.push(State::Value(Value::Object(object)));
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn visit_map_elt<K, V>(&mut self, _first: bool, key: K, value: V) -> Result<(), ()>
|
||||
where K: ser::Serialize,
|
||||
|
||||
Reference in New Issue
Block a user