1use std::str::FromStr;
4
5use crate::lotus_json::lotus_json_with_self;
6
7use super::fvm_shared_latest::version::NetworkVersion as NetworkVersion_latest;
8pub use fvm_shared2::version::NetworkVersion as NetworkVersion_v2;
9use fvm_shared3::version::NetworkVersion as NetworkVersion_v3;
10use fvm_shared4::version::NetworkVersion as NetworkVersion_v4;
11use pastey::paste;
12use schemars::JsonSchema;
13use serde::{Deserialize, Serialize};
14
15#[derive(
32 Debug,
33 Eq,
34 PartialEq,
35 Clone,
36 Copy,
37 Ord,
38 PartialOrd,
39 Serialize,
40 Deserialize,
41 JsonSchema,
42 derive_more::Deref,
43 derive_more::DerefMut,
44 derive_more::From,
45 derive_more::Into,
46 derive_more::Display,
47)]
48#[from(u32, NetworkVersion_v4)]
49#[into(u32, NetworkVersion_v4)]
50#[repr(transparent)]
51#[serde(transparent)]
52pub struct NetworkVersion(#[schemars(with = "u32")] pub NetworkVersion_latest);
53
54lotus_json_with_self!(NetworkVersion);
55
56macro_rules! define_network_versions {
59 ($($version:literal),+ $(,)?) => {
60 impl NetworkVersion {
61 $(
62 paste! {
63 pub const [<V $version>]: Self = Self(NetworkVersion_latest::[<V $version>]);
64 }
65 )+
66 }
67 }
68}
69
70define_network_versions!(
71 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,
72 26, 27, 28,
73);
74
75impl From<NetworkVersion_v2> for NetworkVersion {
76 fn from(value: NetworkVersion_v2) -> Self {
77 NetworkVersion((value as u32).into())
78 }
79}
80
81impl From<NetworkVersion_v3> for NetworkVersion {
82 fn from(value: NetworkVersion_v3) -> Self {
83 NetworkVersion(u32::from(value).into())
84 }
85}
86
87impl From<NetworkVersion> for NetworkVersion_v2 {
88 fn from(other: NetworkVersion) -> NetworkVersion_v2 {
89 u32::from(other.0).try_into().expect("Infallible")
90 }
91}
92
93impl From<NetworkVersion> for NetworkVersion_v3 {
94 fn from(other: NetworkVersion) -> Self {
95 u32::from(other.0).into()
96 }
97}
98
99impl FromStr for NetworkVersion {
100 type Err = <u32 as FromStr>::Err;
101
102 fn from_str(s: &str) -> Result<Self, Self::Err> {
103 let v: u32 = s.parse()?;
104 Ok(v.into())
105 }
106}
107
108#[cfg(test)]
109impl quickcheck::Arbitrary for NetworkVersion {
110 fn arbitrary(g: &mut quickcheck::Gen) -> Self {
111 let value = u32::arbitrary(g);
112 NetworkVersion(NetworkVersion_latest::new(value))
113 }
114}