use crate::tendermint::types::evidence::Sum;
use crate::tendermint::types::Evidence;
#[allow(clippy::large_enum_variant)]
#[derive(Clone, PartialEq, ::serde::Deserialize, ::serde::Serialize)]
#[serde(tag = "type", content = "value")]
pub enum EvidenceVariant {
None,
#[serde(rename = "tendermint/DuplicateVoteEvidence")]
DuplicateVoteEvidence(crate::tendermint::types::DuplicateVoteEvidence),
#[serde(rename = "tendermint/LightClientAttackEvidence")]
LightClientAttackEvidence(crate::tendermint::types::LightClientAttackEvidence),
}
impl From<EvidenceVariant> for Evidence {
fn from(value: EvidenceVariant) -> Self {
match value {
EvidenceVariant::None => Evidence { sum: None },
_ => Evidence {
sum: Some(value.into()),
},
}
}
}
impl From<Evidence> for EvidenceVariant {
fn from(value: Evidence) -> Self {
match value.sum {
Some(sum) => sum.into(),
None => Self::None,
}
}
}
impl From<Sum> for EvidenceVariant {
fn from(value: Sum) -> Self {
match value {
Sum::DuplicateVoteEvidence(d) => Self::DuplicateVoteEvidence(d),
Sum::LightClientAttackEvidence(l) => Self::LightClientAttackEvidence(l),
}
}
}
impl From<EvidenceVariant> for Sum {
fn from(value: EvidenceVariant) -> Self {
match value {
EvidenceVariant::None => {
panic!("non-existent evidence cannot be converted into its protobuf representation")
}
EvidenceVariant::DuplicateVoteEvidence(d) => Self::DuplicateVoteEvidence(d),
EvidenceVariant::LightClientAttackEvidence(l) => Self::LightClientAttackEvidence(l),
}
}
}
#[cfg(test)]
mod test {
use super::*;
#[test]
fn empty_evidence() {
let ev = Evidence { sum: None };
let ev_json = serde_json::to_string(&ev).unwrap();
let ev_deserialized = serde_json::from_str::<Evidence>(&ev_json).unwrap();
assert_eq!(ev, ev_deserialized);
}
}