use serde::de::{Deserialize,Deserializer,Error};
use serde::ser::{Serialize,Serializer};
use types::U256;
#[derive(Debug,Clone,PartialEq,Serialize,Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct SyncInfo {
pub starting_block: U256,
pub current_block: U256,
pub highest_block: U256
}
#[derive(Debug,Clone,PartialEq)]
pub enum SyncState {
Syncing(SyncInfo),
NotSyncing
}
impl<'de> Deserialize<'de> for SyncState {
fn deserialize<D>(deserializer: D) -> Result<Self,D::Error> where D: Deserializer<'de> {
let either: Either<SyncInfo,bool> = Deserialize::deserialize(deserializer)?;
match either {
Either::A(info) => Ok(SyncState::Syncing(info)),
Either::B(boolian) => {
if !boolian {
Ok(SyncState::NotSyncing)
} else {
Err(D::Error::custom("expected object or `false`, got `true`"))
}
}
}
}
}
impl Serialize for SyncState {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok,S::Error> where S: Serializer {
match *self {
SyncState::Syncing(ref info) => info.serialize(serializer),
SyncState::NotSyncing => false.serialize(serializer)
}
}
}
#[derive(Debug,Serialize,Deserialize)]
#[serde(untagged)]
enum Either<A,B> {
A(A),
B(B)
}