forest/shim/
version.rs

1// Copyright 2019-2025 ChainSafe Systems
2// SPDX-License-Identifier: Apache-2.0, MIT
3use 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/// Specifies the network version
18///
19/// # Examples
20/// ```
21/// # use forest::doctest_private::NetworkVersion;
22/// let v0 = NetworkVersion::V0;
23///
24/// // dereference to convert to FVM4
25/// assert_eq!(fvm_shared4::version::NetworkVersion::V0, *v0);
26///
27/// // use `.into()` when FVM3 has to be specified.
28/// assert_eq!(fvm_shared3::version::NetworkVersion::V0, v0.into());
29///
30/// // use `.into()` when FVM2 has to be specified.
31/// assert_eq!(fvm_shared2::version::NetworkVersion::V0, v0.into());
32/// ```
33#[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
42/// Defines public constants V0, V1, ... for [`NetworkVersion`].
43/// Each constant is mapped to the corresponding [`NetworkVersion_latest`] variant.
44macro_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}