mirror of
https://github.com/pezkuwichain/serde.git
synced 2026-06-13 13:41:01 +00:00
Expose variant index to Serializer
This commit is contained in:
+14
-3
@@ -159,7 +159,10 @@ impl<W, F> ser::Serializer for Serializer<W, F>
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn visit_enum_unit(&mut self, _name: &str, variant: &str) -> io::Result<()> {
|
fn visit_enum_unit(&mut self,
|
||||||
|
_name: &str,
|
||||||
|
_variant_index: usize,
|
||||||
|
variant: &str) -> io::Result<()> {
|
||||||
try!(self.formatter.open(&mut self.writer, b'{'));
|
try!(self.formatter.open(&mut self.writer, b'{'));
|
||||||
try!(self.formatter.comma(&mut self.writer, true));
|
try!(self.formatter.comma(&mut self.writer, true));
|
||||||
try!(self.visit_str(variant));
|
try!(self.visit_str(variant));
|
||||||
@@ -190,7 +193,11 @@ impl<W, F> ser::Serializer for Serializer<W, F>
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn visit_enum_seq<V>(&mut self, _name: &str, variant: &str, visitor: V) -> io::Result<()>
|
fn visit_enum_seq<V>(&mut self,
|
||||||
|
_name: &str,
|
||||||
|
_variant_index: usize,
|
||||||
|
variant: &str,
|
||||||
|
visitor: V) -> io::Result<()>
|
||||||
where V: ser::SeqVisitor,
|
where V: ser::SeqVisitor,
|
||||||
{
|
{
|
||||||
try!(self.formatter.open(&mut self.writer, b'{'));
|
try!(self.formatter.open(&mut self.writer, b'{'));
|
||||||
@@ -232,7 +239,11 @@ impl<W, F> ser::Serializer for Serializer<W, F>
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn visit_enum_map<V>(&mut self, _name: &str, variant: &str, visitor: V) -> io::Result<()>
|
fn visit_enum_map<V>(&mut self,
|
||||||
|
_name: &str,
|
||||||
|
_variant_index: usize,
|
||||||
|
variant: &str,
|
||||||
|
visitor: V) -> io::Result<()>
|
||||||
where V: ser::MapVisitor,
|
where V: ser::MapVisitor,
|
||||||
{
|
{
|
||||||
try!(self.formatter.open(&mut self.writer, b'{'));
|
try!(self.formatter.open(&mut self.writer, b'{'));
|
||||||
|
|||||||
+14
-3
@@ -458,7 +458,10 @@ impl ser::Serializer for Serializer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn visit_enum_unit(&mut self, _name: &str, variant: &str) -> Result<(), ()> {
|
fn visit_enum_unit(&mut self,
|
||||||
|
_name: &str,
|
||||||
|
_variant_index: usize,
|
||||||
|
variant: &str) -> Result<(), ()> {
|
||||||
let mut values = BTreeMap::new();
|
let mut values = BTreeMap::new();
|
||||||
values.insert(variant.to_string(), Value::Array(vec![]));
|
values.insert(variant.to_string(), Value::Array(vec![]));
|
||||||
|
|
||||||
@@ -489,7 +492,11 @@ impl ser::Serializer for Serializer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn visit_enum_seq<V>(&mut self, _name: &str, variant: &str, visitor: V) -> Result<(), ()>
|
fn visit_enum_seq<V>(&mut self,
|
||||||
|
_name: &str,
|
||||||
|
_variant_index: usize,
|
||||||
|
variant: &str,
|
||||||
|
visitor: V) -> Result<(), ()>
|
||||||
where V: ser::SeqVisitor,
|
where V: ser::SeqVisitor,
|
||||||
{
|
{
|
||||||
try!(self.visit_seq(visitor));
|
try!(self.visit_seq(visitor));
|
||||||
@@ -548,7 +555,11 @@ impl ser::Serializer for Serializer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn visit_enum_map<V>(&mut self, _name: &str, variant: &str, visitor: V) -> Result<(), ()>
|
fn visit_enum_map<V>(&mut self,
|
||||||
|
_name: &str,
|
||||||
|
_variant_index: usize,
|
||||||
|
variant: &str,
|
||||||
|
visitor: V) -> Result<(), ()>
|
||||||
where V: ser::MapVisitor,
|
where V: ser::MapVisitor,
|
||||||
{
|
{
|
||||||
try!(self.visit_map(visitor));
|
try!(self.visit_map(visitor));
|
||||||
|
|||||||
@@ -650,7 +650,7 @@ impl<T, E> Serialize for Result<T, E> where T: Serialize, E: Serialize {
|
|||||||
state: 0,
|
state: 0,
|
||||||
_structure_ty: data
|
_structure_ty: data
|
||||||
};
|
};
|
||||||
serializer.visit_enum_seq("Result", "Ok", visitor)
|
serializer.visit_enum_seq("Result", 0, "Ok", visitor)
|
||||||
}
|
}
|
||||||
Result::Err(ref field0) => {
|
Result::Err(ref field0) => {
|
||||||
struct Visitor<'a, T, E> where T: Serialize + 'a, E: Serialize + 'a {
|
struct Visitor<'a, T, E> where T: Serialize + 'a, E: Serialize + 'a {
|
||||||
@@ -690,7 +690,7 @@ impl<T, E> Serialize for Result<T, E> where T: Serialize, E: Serialize {
|
|||||||
state: 0,
|
state: 0,
|
||||||
_structure_ty: data
|
_structure_ty: data
|
||||||
};
|
};
|
||||||
serializer.visit_enum_seq("Result", "Err", visitor)
|
serializer.visit_enum_seq("Result", 1, "Err", visitor)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -120,6 +120,7 @@ pub trait Serializer {
|
|||||||
#[inline]
|
#[inline]
|
||||||
fn visit_enum_unit(&mut self,
|
fn visit_enum_unit(&mut self,
|
||||||
_name: &str,
|
_name: &str,
|
||||||
|
_variant_index: usize,
|
||||||
_variant: &str) -> Result<(), Self::Error> {
|
_variant: &str) -> Result<(), Self::Error> {
|
||||||
self.visit_unit()
|
self.visit_unit()
|
||||||
}
|
}
|
||||||
@@ -168,6 +169,7 @@ pub trait Serializer {
|
|||||||
#[inline]
|
#[inline]
|
||||||
fn visit_enum_seq<V>(&mut self,
|
fn visit_enum_seq<V>(&mut self,
|
||||||
_name: &'static str,
|
_name: &'static str,
|
||||||
|
_variant_index: usize,
|
||||||
variant: &'static str,
|
variant: &'static str,
|
||||||
visitor: V) -> Result<(), Self::Error>
|
visitor: V) -> Result<(), Self::Error>
|
||||||
where V: SeqVisitor,
|
where V: SeqVisitor,
|
||||||
@@ -209,6 +211,7 @@ pub trait Serializer {
|
|||||||
#[inline]
|
#[inline]
|
||||||
fn visit_enum_map<V>(&mut self,
|
fn visit_enum_map<V>(&mut self,
|
||||||
_name: &'static str,
|
_name: &'static str,
|
||||||
|
_variant_index: usize,
|
||||||
variant: &'static str,
|
variant: &'static str,
|
||||||
visitor: V) -> Result<(), Self::Error>
|
visitor: V) -> Result<(), Self::Error>
|
||||||
where V: MapVisitor,
|
where V: MapVisitor,
|
||||||
|
|||||||
@@ -243,7 +243,8 @@ fn serialize_item_enum(
|
|||||||
enum_def: &ast::EnumDef,
|
enum_def: &ast::EnumDef,
|
||||||
) -> P<ast::Expr> {
|
) -> P<ast::Expr> {
|
||||||
let arms: Vec<ast::Arm> = enum_def.variants.iter()
|
let arms: Vec<ast::Arm> = enum_def.variants.iter()
|
||||||
.map(|variant| {
|
.enumerate()
|
||||||
|
.map(|(variant_index, variant)| {
|
||||||
serialize_variant(
|
serialize_variant(
|
||||||
cx,
|
cx,
|
||||||
builder,
|
builder,
|
||||||
@@ -251,6 +252,7 @@ fn serialize_item_enum(
|
|||||||
impl_generics,
|
impl_generics,
|
||||||
ty.clone(),
|
ty.clone(),
|
||||||
variant,
|
variant,
|
||||||
|
variant_index,
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
.collect();
|
.collect();
|
||||||
@@ -269,6 +271,7 @@ fn serialize_variant(
|
|||||||
generics: &ast::Generics,
|
generics: &ast::Generics,
|
||||||
ty: P<ast::Ty>,
|
ty: P<ast::Ty>,
|
||||||
variant: &ast::Variant,
|
variant: &ast::Variant,
|
||||||
|
variant_index: usize,
|
||||||
) -> ast::Arm {
|
) -> ast::Arm {
|
||||||
let type_name = builder.expr().str(type_ident);
|
let type_name = builder.expr().str(type_ident);
|
||||||
let variant_ident = variant.node.name;
|
let variant_ident = variant.node.name;
|
||||||
@@ -285,6 +288,7 @@ fn serialize_variant(
|
|||||||
::serde::ser::Serializer::visit_enum_unit(
|
::serde::ser::Serializer::visit_enum_unit(
|
||||||
serializer,
|
serializer,
|
||||||
$type_name,
|
$type_name,
|
||||||
|
$variant_index,
|
||||||
$variant_name,
|
$variant_name,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@@ -304,6 +308,7 @@ fn serialize_variant(
|
|||||||
cx,
|
cx,
|
||||||
builder,
|
builder,
|
||||||
type_name,
|
type_name,
|
||||||
|
variant_index,
|
||||||
variant_name,
|
variant_name,
|
||||||
generics,
|
generics,
|
||||||
ty,
|
ty,
|
||||||
@@ -340,6 +345,7 @@ fn serialize_variant(
|
|||||||
cx,
|
cx,
|
||||||
builder,
|
builder,
|
||||||
type_name,
|
type_name,
|
||||||
|
variant_index,
|
||||||
variant_name,
|
variant_name,
|
||||||
generics,
|
generics,
|
||||||
ty,
|
ty,
|
||||||
@@ -356,6 +362,7 @@ fn serialize_tuple_variant(
|
|||||||
cx: &ExtCtxt,
|
cx: &ExtCtxt,
|
||||||
builder: &aster::AstBuilder,
|
builder: &aster::AstBuilder,
|
||||||
type_name: P<ast::Expr>,
|
type_name: P<ast::Expr>,
|
||||||
|
variant_index: usize,
|
||||||
variant_name: P<ast::Expr>,
|
variant_name: P<ast::Expr>,
|
||||||
generics: &ast::Generics,
|
generics: &ast::Generics,
|
||||||
structure_ty: P<ast::Ty>,
|
structure_ty: P<ast::Ty>,
|
||||||
@@ -395,7 +402,7 @@ fn serialize_tuple_variant(
|
|||||||
quote_expr!(cx, {
|
quote_expr!(cx, {
|
||||||
$visitor_struct
|
$visitor_struct
|
||||||
$visitor_impl
|
$visitor_impl
|
||||||
serializer.visit_enum_seq($type_name, $variant_name, Visitor {
|
serializer.visit_enum_seq($type_name, $variant_index, $variant_name, Visitor {
|
||||||
value: $value_expr,
|
value: $value_expr,
|
||||||
state: 0,
|
state: 0,
|
||||||
_structure_ty: ::std::marker::PhantomData,
|
_structure_ty: ::std::marker::PhantomData,
|
||||||
@@ -407,6 +414,7 @@ fn serialize_struct_variant(
|
|||||||
cx: &ExtCtxt,
|
cx: &ExtCtxt,
|
||||||
builder: &aster::AstBuilder,
|
builder: &aster::AstBuilder,
|
||||||
type_name: P<ast::Expr>,
|
type_name: P<ast::Expr>,
|
||||||
|
variant_index: usize,
|
||||||
variant_name: P<ast::Expr>,
|
variant_name: P<ast::Expr>,
|
||||||
generics: &ast::Generics,
|
generics: &ast::Generics,
|
||||||
structure_ty: P<ast::Ty>,
|
structure_ty: P<ast::Ty>,
|
||||||
@@ -451,7 +459,7 @@ fn serialize_struct_variant(
|
|||||||
quote_expr!(cx, {
|
quote_expr!(cx, {
|
||||||
$visitor_struct
|
$visitor_struct
|
||||||
$visitor_impl
|
$visitor_impl
|
||||||
serializer.visit_enum_map($type_name, $variant_name, Visitor {
|
serializer.visit_enum_map($type_name, $variant_index, $variant_name, Visitor {
|
||||||
value: $value_expr,
|
value: $value_expr,
|
||||||
state: 0,
|
state: 0,
|
||||||
_structure_ty: ::std::marker::PhantomData,
|
_structure_ty: ::std::marker::PhantomData,
|
||||||
|
|||||||
@@ -85,7 +85,10 @@ impl<'a> Serializer for AssertSerializer<'a> {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn visit_enum_unit(&mut self, name: &str, variant: &str) -> Result<(), ()> {
|
fn visit_enum_unit(&mut self,
|
||||||
|
name: &str,
|
||||||
|
_variant_index: usize,
|
||||||
|
variant: &str) -> Result<(), ()> {
|
||||||
assert_eq!(self.iter.next().unwrap(), Token::EnumUnit(name, variant));
|
assert_eq!(self.iter.next().unwrap(), Token::EnumUnit(name, variant));
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
@@ -200,6 +203,7 @@ impl<'a> Serializer for AssertSerializer<'a> {
|
|||||||
|
|
||||||
fn visit_enum_seq<V>(&mut self,
|
fn visit_enum_seq<V>(&mut self,
|
||||||
name: &str,
|
name: &str,
|
||||||
|
_variant_index: usize,
|
||||||
variant: &str,
|
variant: &str,
|
||||||
visitor: V) -> Result<(), ()>
|
visitor: V) -> Result<(), ()>
|
||||||
where V: SeqVisitor
|
where V: SeqVisitor
|
||||||
@@ -238,7 +242,11 @@ impl<'a> Serializer for AssertSerializer<'a> {
|
|||||||
self.visit_mapping(visitor)
|
self.visit_mapping(visitor)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn visit_enum_map<V>(&mut self, name: &str, variant: &str, visitor: V) -> Result<(), ()>
|
fn visit_enum_map<V>(&mut self,
|
||||||
|
name: &str,
|
||||||
|
_variant_index: usize,
|
||||||
|
variant: &str,
|
||||||
|
visitor: V) -> Result<(), ()>
|
||||||
where V: MapVisitor
|
where V: MapVisitor
|
||||||
{
|
{
|
||||||
let len = visitor.len();
|
let len = visitor.len();
|
||||||
|
|||||||
Reference in New Issue
Block a user