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