// Copyright 2015-2019 Parity Technologies (UK) Ltd.
// This file is part of Parity Ethereum.
// Parity Ethereum 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.
// Parity Ethereum 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 Parity Ethereum. If not, see .
//! Deserializer of empty string values into optionals.
use std::fmt;
use std::marker::PhantomData;
use serde::{Deserialize, Deserializer};
use serde::de::{Error, Visitor, IntoDeserializer};
/// 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