Skip to main content

forest/shim/
version.rs

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