mirror of
https://github.com/pezkuwichain/serde.git
synced 2026-06-14 16:21:03 +00:00
Fix serializing named units
This commit is contained in:
@@ -127,10 +127,17 @@ fn serialize_substructure(cx: &ExtCtxt,
|
|||||||
match (&item.node, &*substr.fields) {
|
match (&item.node, &*substr.fields) {
|
||||||
(&ast::ItemStruct(ref struct_def, _), &Struct(ref fields)) => {
|
(&ast::ItemStruct(ref struct_def, _), &Struct(ref fields)) => {
|
||||||
if fields.is_empty() {
|
if fields.is_empty() {
|
||||||
serialize_tuple_struct(cx)
|
serialize_tuple_struct(cx,
|
||||||
|
span,
|
||||||
|
visitor,
|
||||||
|
substr.type_ident)
|
||||||
} else {
|
} else {
|
||||||
serialize_struct(
|
serialize_struct(cx,
|
||||||
cx, span, visitor, substr.type_ident, fields, struct_def)
|
span,
|
||||||
|
visitor,
|
||||||
|
substr.type_ident,
|
||||||
|
fields,
|
||||||
|
struct_def)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -148,9 +155,15 @@ fn serialize_substructure(cx: &ExtCtxt,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn serialize_tuple_struct(cx: &ExtCtxt) -> P<Expr> {
|
fn serialize_tuple_struct(cx: &ExtCtxt,
|
||||||
// unit structs have no fields and need to return `Ok()`
|
span: Span,
|
||||||
quote_expr!(cx, Ok(()))
|
visitor: P<Expr>,
|
||||||
|
type_ident: Ident) -> P<Expr> {
|
||||||
|
let type_name = cx.expr_str(
|
||||||
|
span,
|
||||||
|
token::get_ident(type_ident));
|
||||||
|
|
||||||
|
quote_expr!(cx, $visitor.visit_named_unit($type_name))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn serialize_struct(cx: &ExtCtxt,
|
fn serialize_struct(cx: &ExtCtxt,
|
||||||
@@ -207,9 +220,9 @@ fn serialize_struct(cx: &ExtCtxt,
|
|||||||
|
|
||||||
impl<'a> ::serde2::ser::MapVisitor for Visitor<'a> {
|
impl<'a> ::serde2::ser::MapVisitor for Visitor<'a> {
|
||||||
#[inline]
|
#[inline]
|
||||||
fn visit<
|
fn visit<V>(&mut self, visitor: &mut V) -> Result<Option<V::Value>, V::Error>
|
||||||
V: ::serde2::ser::Visitor,
|
where V: ::serde2::ser::Visitor,
|
||||||
>(&mut self, visitor: &mut V) -> Result<Option<V::Value>, V::Error> {
|
{
|
||||||
match self.state {
|
match self.state {
|
||||||
$arms
|
$arms
|
||||||
_ => Ok(None),
|
_ => Ok(None),
|
||||||
@@ -515,9 +528,9 @@ fn serialize_variant(
|
|||||||
let methods = vec![
|
let methods = vec![
|
||||||
ast::MethodImplItem(
|
ast::MethodImplItem(
|
||||||
quote_method!(cx,
|
quote_method!(cx,
|
||||||
fn visit<
|
fn visit<V>(&mut self, visitor: &mut V) -> Result<Option<V::Value>, V::Error>
|
||||||
V: ::serde2::ser::Visitor,
|
where V: ::serde2::ser::Visitor,
|
||||||
>(&mut self, visitor: &mut V) -> Result<Option<V::Value>, V::Error> {
|
{
|
||||||
match self.state {
|
match self.state {
|
||||||
$visitor_arms
|
$visitor_arms
|
||||||
_ => Ok(None),
|
_ => Ok(None),
|
||||||
@@ -711,9 +724,9 @@ fn deserialize_struct_empty_fields(
|
|||||||
type Value = $type_ident;
|
type Value = $type_ident;
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn visit_unit<
|
fn visit_unit<E>(&mut self) -> Result<$type_ident, E>
|
||||||
E: ::serde2::de::Error,
|
where E: ::serde2::de::Error,
|
||||||
>(&mut self) -> Result<$type_ident, E> {
|
{
|
||||||
Ok($result)
|
Ok($result)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -761,15 +774,17 @@ fn deserialize_struct_unnamed_fields(
|
|||||||
impl ::serde2::de::Visitor for __Visitor {
|
impl ::serde2::de::Visitor for __Visitor {
|
||||||
type Value = $type_ident;
|
type Value = $type_ident;
|
||||||
|
|
||||||
fn visit_seq<
|
fn visit_seq<__V>(&mut self, mut visitor: __V) -> Result<$type_ident, __V::Error>
|
||||||
__V: ::serde2::de::SeqVisitor,
|
where __V: ::serde2::de::SeqVisitor,
|
||||||
>(&mut self, mut visitor: __V) -> Result<$type_ident, __V::Error> {
|
{
|
||||||
$visit_seq_expr
|
$visit_seq_expr
|
||||||
}
|
}
|
||||||
|
|
||||||
fn visit_named_seq<
|
fn visit_named_seq<__V>(&mut self,
|
||||||
__V: ::serde2::de::SeqVisitor,
|
name: &str,
|
||||||
>(&mut self, name: &str, visitor: __V) -> Result<$type_ident, __V::Error> {
|
visitor: __V) -> Result<$type_ident, __V::Error>
|
||||||
|
where __V: ::serde2::de::SeqVisitor,
|
||||||
|
{
|
||||||
if name == $struct_name {
|
if name == $struct_name {
|
||||||
self.visit_seq(visitor)
|
self.visit_seq(visitor)
|
||||||
} else {
|
} else {
|
||||||
@@ -858,16 +873,18 @@ fn deserialize_struct_named_fields(
|
|||||||
type Value = $type_ident;
|
type Value = $type_ident;
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn visit_map<
|
fn visit_map<__V>(&mut self, mut visitor: __V) -> Result<$type_ident, __V::Error>
|
||||||
__V: ::serde2::de::MapVisitor,
|
where __V: ::serde2::de::MapVisitor,
|
||||||
>(&mut self, mut visitor: __V) -> Result<$type_ident, __V::Error> {
|
{
|
||||||
$visit_map_expr
|
$visit_map_expr
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn visit_named_map<
|
fn visit_named_map<__V>(&mut self,
|
||||||
__V: ::serde2::de::MapVisitor,
|
name: &str,
|
||||||
>(&mut self, name: &str, visitor: __V) -> Result<$type_ident, __V::Error> {
|
visitor: __V) -> Result<$type_ident, __V::Error>
|
||||||
|
where __V: ::serde2::de::MapVisitor,
|
||||||
|
{
|
||||||
if name == $struct_name {
|
if name == $struct_name {
|
||||||
self.visit_map(visitor)
|
self.visit_map(visitor)
|
||||||
} else {
|
} else {
|
||||||
@@ -969,9 +986,9 @@ fn declare_map_field_deserializer(
|
|||||||
impl ::serde2::de::Visitor for __FieldVisitor {
|
impl ::serde2::de::Visitor for __FieldVisitor {
|
||||||
type Value = __Field;
|
type Value = __Field;
|
||||||
|
|
||||||
fn visit_str<
|
fn visit_str<E>(&mut self, value: &str) -> Result<__Field, E>
|
||||||
E: ::serde2::de::Error,
|
where E: ::serde2::de::Error,
|
||||||
>(&mut self, value: &str) -> Result<__Field, E> {
|
{
|
||||||
match value {
|
match value {
|
||||||
$field_arms
|
$field_arms
|
||||||
_ => Err(::serde2::de::Error::syntax_error()),
|
_ => Err(::serde2::de::Error::syntax_error()),
|
||||||
@@ -983,9 +1000,9 @@ fn declare_map_field_deserializer(
|
|||||||
quote_item!(cx,
|
quote_item!(cx,
|
||||||
impl ::serde2::de::Deserialize for __Field {
|
impl ::serde2::de::Deserialize for __Field {
|
||||||
#[inline]
|
#[inline]
|
||||||
fn deserialize<
|
fn deserialize<S>(state: &mut S) -> Result<__Field, S::Error>
|
||||||
__S: ::serde2::de::Deserializer,
|
where S: ::serde2::de::Deserializer,
|
||||||
>(state: &mut __S) -> Result<__Field, __S::Error> {
|
{
|
||||||
state.visit(__FieldVisitor)
|
state.visit(__FieldVisitor)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,6 +9,9 @@ trait Trait {
|
|||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#[derive_serialize]
|
||||||
|
struct NamedUnit;
|
||||||
|
|
||||||
#[derive_serialize]
|
#[derive_serialize]
|
||||||
//#[derive_deserialize]
|
//#[derive_deserialize]
|
||||||
enum Enum<'a, A: 'a, B: /* Trait + */ 'a, C> where C: /* Trait + */ 'a {
|
enum Enum<'a, A: 'a, B: /* Trait + */ 'a, C> where C: /* Trait + */ 'a {
|
||||||
|
|||||||
Reference in New Issue
Block a user