Implement matches() directly on FromXml
This commit is contained in:
parent
9b2cd415af
commit
6b3fa93f69
|
@ -57,6 +57,14 @@ fn deserialize_scalar_enum(
|
||||||
|
|
||||||
quote!(
|
quote!(
|
||||||
impl #impl_generics FromXml<'xml> for #ident #ty_generics #where_clause {
|
impl #impl_generics FromXml<'xml> for #ident #ty_generics #where_clause {
|
||||||
|
#[inline]
|
||||||
|
fn matches(id: ::instant_xml::Id<'_>, field: Option<::instant_xml::Id<'_>>) -> bool {
|
||||||
|
match field {
|
||||||
|
Some(field) => id == field,
|
||||||
|
None => false,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn deserialize<'cx>(
|
fn deserialize<'cx>(
|
||||||
deserializer: &mut ::instant_xml::Deserializer<'cx, 'xml>,
|
deserializer: &mut ::instant_xml::Deserializer<'cx, 'xml>,
|
||||||
into: &mut Option<Self>,
|
into: &mut Option<Self>,
|
||||||
|
@ -123,14 +131,14 @@ fn deserialize_wrapped_enum(
|
||||||
}
|
}
|
||||||
|
|
||||||
let v_ident = &variant.ident;
|
let v_ident = &variant.ident;
|
||||||
variants.extend(quote!(if <#no_lifetime_type as FromXml>::KIND.matches(
|
variants.extend(
|
||||||
id, ::instant_xml::Id { ns: "", name: "" }
|
quote!(if <#no_lifetime_type as FromXml>::matches(id, None) {
|
||||||
) {
|
|
||||||
let mut nested = deserializer.nested(data);
|
let mut nested = deserializer.nested(data);
|
||||||
let mut value = None;
|
let mut value = None;
|
||||||
#no_lifetime_type::deserialize(&mut nested, &mut value)?;
|
#no_lifetime_type::deserialize(&mut nested, &mut value)?;
|
||||||
*into = value.map(#ident::#v_ident);
|
*into = value.map(#ident::#v_ident);
|
||||||
}));
|
}),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
let name = meta.tag();
|
let name = meta.tag();
|
||||||
|
@ -140,6 +148,14 @@ fn deserialize_wrapped_enum(
|
||||||
let (_, ty_generics, where_clause) = input.generics.split_for_impl();
|
let (_, ty_generics, where_clause) = input.generics.split_for_impl();
|
||||||
quote!(
|
quote!(
|
||||||
impl #xml_impl_generics FromXml<'xml> for #ident #ty_generics #where_clause {
|
impl #xml_impl_generics FromXml<'xml> for #ident #ty_generics #where_clause {
|
||||||
|
#[inline]
|
||||||
|
fn matches(id: ::instant_xml::Id<'_>, field: Option<::instant_xml::Id<'_>>) -> bool {
|
||||||
|
match field {
|
||||||
|
Some(field) => id == field,
|
||||||
|
None => false,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn deserialize<'cx>(
|
fn deserialize<'cx>(
|
||||||
deserializer: &mut ::instant_xml::Deserializer<'cx, 'xml>,
|
deserializer: &mut ::instant_xml::Deserializer<'cx, 'xml>,
|
||||||
into: &mut Option<Self>,
|
into: &mut Option<Self>,
|
||||||
|
@ -260,6 +276,11 @@ fn deserialize_struct(
|
||||||
|
|
||||||
quote!(
|
quote!(
|
||||||
impl #xml_impl_generics FromXml<'xml> for #ident #ty_generics #where_clause {
|
impl #xml_impl_generics FromXml<'xml> for #ident #ty_generics #where_clause {
|
||||||
|
#[inline]
|
||||||
|
fn matches(id: ::instant_xml::Id<'_>, field: Option<::instant_xml::Id<'_>>) -> bool {
|
||||||
|
id == ::instant_xml::Id { ns: #default_namespace, name: #name }
|
||||||
|
}
|
||||||
|
|
||||||
fn deserialize<'cx>(
|
fn deserialize<'cx>(
|
||||||
deserializer: &mut ::instant_xml::Deserializer<'cx, 'xml>,
|
deserializer: &mut ::instant_xml::Deserializer<'cx, 'xml>,
|
||||||
into: &mut Option<Self>,
|
into: &mut Option<Self>,
|
||||||
|
@ -370,7 +391,7 @@ fn named_field(
|
||||||
tokens.branches.extend(quote!(else));
|
tokens.branches.extend(quote!(else));
|
||||||
}
|
}
|
||||||
tokens.branches.extend(quote!(
|
tokens.branches.extend(quote!(
|
||||||
if <#no_lifetime_type as FromXml>::KIND.matches(id, Id { ns: #ns, name: #field_tag })
|
if <#no_lifetime_type as FromXml>::matches(id, Some(Id { ns: #ns, name: #field_tag }))
|
||||||
));
|
));
|
||||||
|
|
||||||
tokens.branches.extend(match field_meta.attribute {
|
tokens.branches.extend(match field_meta.attribute {
|
||||||
|
@ -512,6 +533,11 @@ fn deserialize_tuple_struct(
|
||||||
|
|
||||||
quote!(
|
quote!(
|
||||||
impl #xml_impl_generics FromXml<'xml> for #ident #ty_generics #where_clause {
|
impl #xml_impl_generics FromXml<'xml> for #ident #ty_generics #where_clause {
|
||||||
|
#[inline]
|
||||||
|
fn matches(id: ::instant_xml::Id<'_>, field: Option<::instant_xml::Id<'_>>) -> bool {
|
||||||
|
id == ::instant_xml::Id { ns: #default_namespace, name: #name }
|
||||||
|
}
|
||||||
|
|
||||||
fn deserialize<'cx>(
|
fn deserialize<'cx>(
|
||||||
deserializer: &mut ::instant_xml::Deserializer<'cx, 'xml>,
|
deserializer: &mut ::instant_xml::Deserializer<'cx, 'xml>,
|
||||||
into: &mut Option<Self>,
|
into: &mut Option<Self>,
|
||||||
|
@ -587,6 +613,11 @@ fn deserialize_unit_struct(input: &syn::DeriveInput, meta: &ContainerMeta) -> To
|
||||||
|
|
||||||
quote!(
|
quote!(
|
||||||
impl #xml_impl_generics FromXml<'xml> for #ident #ty_generics #where_clause {
|
impl #xml_impl_generics FromXml<'xml> for #ident #ty_generics #where_clause {
|
||||||
|
#[inline]
|
||||||
|
fn matches(id: ::instant_xml::Id<'_>, field: Option<::instant_xml::Id<'_>>) -> bool {
|
||||||
|
id == ::instant_xml::Id { ns: #default_namespace, name: #name }
|
||||||
|
}
|
||||||
|
|
||||||
fn deserialize<'cx>(
|
fn deserialize<'cx>(
|
||||||
deserializer: &mut ::instant_xml::Deserializer<'cx, 'xml>,
|
deserializer: &mut ::instant_xml::Deserializer<'cx, 'xml>,
|
||||||
into: &mut Option<Self>,
|
into: &mut Option<Self>,
|
||||||
|
|
|
@ -12,6 +12,14 @@ use crate::{Deserializer, Error, FromXml, Id, Kind, Serializer, ToXml};
|
||||||
struct FromXmlStr<T: FromStr>(T);
|
struct FromXmlStr<T: FromStr>(T);
|
||||||
|
|
||||||
impl<'xml, T: FromStr> FromXml<'xml> for FromXmlStr<T> {
|
impl<'xml, T: FromStr> FromXml<'xml> for FromXmlStr<T> {
|
||||||
|
#[inline]
|
||||||
|
fn matches(id: Id<'_>, field: Option<Id<'_>>) -> bool {
|
||||||
|
match field {
|
||||||
|
Some(field) => id == field,
|
||||||
|
None => false,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn deserialize(
|
fn deserialize(
|
||||||
deserializer: &mut Deserializer<'_, 'xml>,
|
deserializer: &mut Deserializer<'_, 'xml>,
|
||||||
into: &mut Option<Self>,
|
into: &mut Option<Self>,
|
||||||
|
@ -34,6 +42,14 @@ impl<'xml, T: FromStr> FromXml<'xml> for FromXmlStr<T> {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'xml> FromXml<'xml> for bool {
|
impl<'xml> FromXml<'xml> for bool {
|
||||||
|
#[inline]
|
||||||
|
fn matches(id: Id<'_>, field: Option<Id<'_>>) -> bool {
|
||||||
|
match field {
|
||||||
|
Some(field) => id == field,
|
||||||
|
None => false,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn deserialize<'cx>(
|
fn deserialize<'cx>(
|
||||||
deserializer: &mut Deserializer<'cx, 'xml>,
|
deserializer: &mut Deserializer<'cx, 'xml>,
|
||||||
into: &mut Option<Self>,
|
into: &mut Option<Self>,
|
||||||
|
@ -107,6 +123,14 @@ macro_rules! to_xml_for_number {
|
||||||
macro_rules! from_xml_for_number {
|
macro_rules! from_xml_for_number {
|
||||||
($typ:ty) => {
|
($typ:ty) => {
|
||||||
impl<'xml> FromXml<'xml> for $typ {
|
impl<'xml> FromXml<'xml> for $typ {
|
||||||
|
#[inline]
|
||||||
|
fn matches(id: Id<'_>, field: Option<Id<'_>>) -> bool {
|
||||||
|
match field {
|
||||||
|
Some(field) => id == field,
|
||||||
|
None => false,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn deserialize<'cx>(
|
fn deserialize<'cx>(
|
||||||
deserializer: &mut Deserializer<'cx, 'xml>,
|
deserializer: &mut Deserializer<'cx, 'xml>,
|
||||||
into: &mut Option<Self>,
|
into: &mut Option<Self>,
|
||||||
|
@ -145,6 +169,14 @@ from_xml_for_number!(f32);
|
||||||
from_xml_for_number!(f64);
|
from_xml_for_number!(f64);
|
||||||
|
|
||||||
impl<'xml> FromXml<'xml> for char {
|
impl<'xml> FromXml<'xml> for char {
|
||||||
|
#[inline]
|
||||||
|
fn matches(id: Id<'_>, field: Option<Id<'_>>) -> bool {
|
||||||
|
match field {
|
||||||
|
Some(field) => id == field,
|
||||||
|
None => false,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn deserialize<'cx>(
|
fn deserialize<'cx>(
|
||||||
deserializer: &mut Deserializer<'cx, 'xml>,
|
deserializer: &mut Deserializer<'cx, 'xml>,
|
||||||
into: &mut Option<Self>,
|
into: &mut Option<Self>,
|
||||||
|
@ -168,6 +200,14 @@ impl<'xml> FromXml<'xml> for char {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'xml> FromXml<'xml> for String {
|
impl<'xml> FromXml<'xml> for String {
|
||||||
|
#[inline]
|
||||||
|
fn matches(id: Id<'_>, field: Option<Id<'_>>) -> bool {
|
||||||
|
match field {
|
||||||
|
Some(field) => id == field,
|
||||||
|
None => false,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn deserialize<'cx>(
|
fn deserialize<'cx>(
|
||||||
deserializer: &mut Deserializer<'cx, 'xml>,
|
deserializer: &mut Deserializer<'cx, 'xml>,
|
||||||
into: &mut Option<Self>,
|
into: &mut Option<Self>,
|
||||||
|
@ -185,6 +225,14 @@ impl<'xml> FromXml<'xml> for String {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'xml> FromXml<'xml> for &'xml str {
|
impl<'xml> FromXml<'xml> for &'xml str {
|
||||||
|
#[inline]
|
||||||
|
fn matches(id: Id<'_>, field: Option<Id<'_>>) -> bool {
|
||||||
|
match field {
|
||||||
|
Some(field) => id == field,
|
||||||
|
None => false,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn deserialize<'cx>(
|
fn deserialize<'cx>(
|
||||||
deserializer: &mut Deserializer<'cx, 'xml>,
|
deserializer: &mut Deserializer<'cx, 'xml>,
|
||||||
into: &mut Option<Self>,
|
into: &mut Option<Self>,
|
||||||
|
@ -214,6 +262,14 @@ where
|
||||||
T: ToOwned,
|
T: ToOwned,
|
||||||
T::Owned: FromXml<'xml>,
|
T::Owned: FromXml<'xml>,
|
||||||
{
|
{
|
||||||
|
#[inline]
|
||||||
|
fn matches(id: Id<'_>, field: Option<Id<'_>>) -> bool {
|
||||||
|
match field {
|
||||||
|
Some(field) => id == field,
|
||||||
|
None => false,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn deserialize(
|
fn deserialize(
|
||||||
deserializer: &mut Deserializer<'_, 'xml>,
|
deserializer: &mut Deserializer<'_, 'xml>,
|
||||||
into: &mut Option<Self>,
|
into: &mut Option<Self>,
|
||||||
|
@ -237,6 +293,11 @@ where
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'xml, T: FromXml<'xml>> FromXml<'xml> for Option<T> {
|
impl<'xml, T: FromXml<'xml>> FromXml<'xml> for Option<T> {
|
||||||
|
#[inline]
|
||||||
|
fn matches(id: Id<'_>, field: Option<Id<'_>>) -> bool {
|
||||||
|
T::matches(id, field)
|
||||||
|
}
|
||||||
|
|
||||||
fn deserialize<'cx>(
|
fn deserialize<'cx>(
|
||||||
deserializer: &mut Deserializer<'cx, 'xml>,
|
deserializer: &mut Deserializer<'cx, 'xml>,
|
||||||
into: &mut Option<Self>,
|
into: &mut Option<Self>,
|
||||||
|
@ -446,6 +507,11 @@ pub(crate) fn decode(input: &str) -> Cow<'_, str> {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'xml, T: FromXml<'xml>> FromXml<'xml> for Vec<T> {
|
impl<'xml, T: FromXml<'xml>> FromXml<'xml> for Vec<T> {
|
||||||
|
#[inline]
|
||||||
|
fn matches(id: Id<'_>, field: Option<Id<'_>>) -> bool {
|
||||||
|
T::matches(id, field)
|
||||||
|
}
|
||||||
|
|
||||||
fn deserialize<'cx>(
|
fn deserialize<'cx>(
|
||||||
deserializer: &mut Deserializer<'cx, 'xml>,
|
deserializer: &mut Deserializer<'cx, 'xml>,
|
||||||
into: &mut Option<Self>,
|
into: &mut Option<Self>,
|
||||||
|
@ -512,6 +578,14 @@ impl ToXml for DateTime<Utc> {
|
||||||
|
|
||||||
#[cfg(feature = "chrono")]
|
#[cfg(feature = "chrono")]
|
||||||
impl<'xml> FromXml<'xml> for DateTime<Utc> {
|
impl<'xml> FromXml<'xml> for DateTime<Utc> {
|
||||||
|
#[inline]
|
||||||
|
fn matches(id: Id<'_>, field: Option<Id<'_>>) -> bool {
|
||||||
|
match field {
|
||||||
|
Some(field) => id == field,
|
||||||
|
None => false,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn deserialize<'cx>(
|
fn deserialize<'cx>(
|
||||||
deserializer: &mut Deserializer<'cx, 'xml>,
|
deserializer: &mut Deserializer<'cx, 'xml>,
|
||||||
into: &mut Option<Self>,
|
into: &mut Option<Self>,
|
||||||
|
@ -534,6 +608,14 @@ impl<'xml> FromXml<'xml> for DateTime<Utc> {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'xml> FromXml<'xml> for () {
|
impl<'xml> FromXml<'xml> for () {
|
||||||
|
#[inline]
|
||||||
|
fn matches(id: Id<'_>, field: Option<Id<'_>>) -> bool {
|
||||||
|
match field {
|
||||||
|
Some(field) => id == field,
|
||||||
|
None => false,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn deserialize<'cx>(
|
fn deserialize<'cx>(
|
||||||
_: &mut Deserializer<'cx, 'xml>,
|
_: &mut Deserializer<'cx, 'xml>,
|
||||||
into: &mut Option<Self>,
|
into: &mut Option<Self>,
|
||||||
|
@ -558,6 +640,14 @@ impl ToXml for IpAddr {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'xml> FromXml<'xml> for IpAddr {
|
impl<'xml> FromXml<'xml> for IpAddr {
|
||||||
|
#[inline]
|
||||||
|
fn matches(id: Id<'_>, field: Option<Id<'_>>) -> bool {
|
||||||
|
match field {
|
||||||
|
Some(field) => id == field,
|
||||||
|
None => false,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn deserialize<'cx>(
|
fn deserialize<'cx>(
|
||||||
deserializer: &mut Deserializer<'cx, 'xml>,
|
deserializer: &mut Deserializer<'cx, 'xml>,
|
||||||
into: &mut Option<Self>,
|
into: &mut Option<Self>,
|
||||||
|
|
|
@ -36,6 +36,8 @@ impl<'a, T: ToXml + ?Sized> ToXml for &'a T {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub trait FromXml<'xml>: Sized {
|
pub trait FromXml<'xml>: Sized {
|
||||||
|
fn matches(id: Id<'_>, field: Option<Id<'_>>) -> bool;
|
||||||
|
|
||||||
fn deserialize<'cx>(
|
fn deserialize<'cx>(
|
||||||
deserializer: &mut Deserializer<'cx, 'xml>,
|
deserializer: &mut Deserializer<'cx, 'xml>,
|
||||||
into: &mut Option<Self>,
|
into: &mut Option<Self>,
|
||||||
|
@ -132,14 +134,6 @@ impl<'a> Kind<'a> {
|
||||||
_ => panic!("expected element kind"),
|
_ => panic!("expected element kind"),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
|
||||||
pub fn matches(&self, id: Id<'_>, field: Id<'_>) -> bool {
|
|
||||||
match self {
|
|
||||||
Kind::Scalar => id == field,
|
|
||||||
Kind::Element(name) => id == *name,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
|
#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
|
||||||
|
|
Loading…
Reference in New Issue