// Copyright 2015-2020 Parity Technologies (UK) Ltd.
// This file is part of OpenEthereum.
// OpenEthereum is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
// OpenEthereum is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License
// along with OpenEthereum. If not, see .
//! Deserializer of empty string values into optionals.
use serde::{
de::{Error, IntoDeserializer, Visitor},
Deserialize, Deserializer,
};
use std::{fmt, marker::PhantomData};
/// Deserializer of empty string values into optionals.
#[derive(Debug, PartialEq, Clone)]
pub enum MaybeEmpty {
/// Some.
Some(T),
/// None.
None,
}
impl<'a, T> Deserialize<'a> for MaybeEmpty
where
T: Deserialize<'a>,
{
fn deserialize(deserializer: D) -> Result
where
D: Deserializer<'a>,
{
deserializer.deserialize_any(MaybeEmptyVisitor::new())
}
}
struct MaybeEmptyVisitor {
_phantom: PhantomData,
}
impl MaybeEmptyVisitor {
fn new() -> Self {
MaybeEmptyVisitor {
_phantom: PhantomData,
}
}
}
impl<'a, T> Visitor<'a> for MaybeEmptyVisitor
where
T: Deserialize<'a>,
{
type Value = MaybeEmpty;
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
write!(formatter, "an empty string or string-encoded type")
}
fn visit_str(self, value: &str) -> Result
where
E: Error,
{
self.visit_string(value.to_owned())
}
fn visit_string(self, value: String) -> Result
where
E: Error,
{
match value.is_empty() {
true => Ok(MaybeEmpty::None),
false => T::deserialize(value.into_deserializer()).map(MaybeEmpty::Some),
}
}
}
impl Into