use std::str::FromStr;
use crate::lotus_json::lotus_json_with_self;
use super::fvm_shared_latest::version::NetworkVersion as NetworkVersion_latest;
pub use fvm_shared2::version::NetworkVersion as NetworkVersion_v2;
use fvm_shared3::version::NetworkVersion as NetworkVersion_v3;
use fvm_shared4::version::NetworkVersion as NetworkVersion_v4;
use pastey::paste;
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
#[derive(
Debug,
Eq,
PartialEq,
Clone,
Copy,
Ord,
PartialOrd,
Serialize,
Deserialize,
JsonSchema,
derive_more::Deref,
derive_more::DerefMut,
derive_more::From,
derive_more::Into,
derive_more::Display,
)]
#[from(u32, NetworkVersion_v4)]
#[into(u32, NetworkVersion_v4)]
#[repr(transparent)]
#[serde(transparent)]
pub struct NetworkVersion(#[schemars(with = "u32")] pub NetworkVersion_latest);
lotus_json_with_self!(NetworkVersion);
macro_rules! define_network_versions {
($($version:literal),+ $(,)?) => {
impl NetworkVersion {
$(
paste! {
pub const [<V $version>]: Self = Self(NetworkVersion_latest::[<V $version>]);
}
)+
}
}
}
define_network_versions!(
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
26, 27, 28,
);
impl From<NetworkVersion_v2> for NetworkVersion {
fn from(value: NetworkVersion_v2) -> Self {
NetworkVersion((value as u32).into())
}
}
impl From<NetworkVersion_v3> for NetworkVersion {
fn from(value: NetworkVersion_v3) -> Self {
NetworkVersion(u32::from(value).into())
}
}
impl From<NetworkVersion> for NetworkVersion_v2 {
fn from(other: NetworkVersion) -> NetworkVersion_v2 {
u32::from(other.0).try_into().expect("Infallible")
}
}
impl From<NetworkVersion> for NetworkVersion_v3 {
fn from(other: NetworkVersion) -> Self {
u32::from(other.0).into()
}
}
impl FromStr for NetworkVersion {
type Err = <u32 as FromStr>::Err;
fn from_str(s: &str) -> Result<Self, Self::Err> {
let v: u32 = s.parse()?;
Ok(v.into())
}
}
#[cfg(test)]
impl quickcheck::Arbitrary for NetworkVersion {
fn arbitrary(g: &mut quickcheck::Gen) -> Self {
let value = u32::arbitrary(g);
NetworkVersion(NetworkVersion_latest::new(value))
}
}