snops_common/state/
network.rs

1use serde::{Deserialize, Serialize};
2
3use crate::format::DataFormat;
4
5#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Hash)]
6#[serde(rename_all = "snake_case")]
7#[non_exhaustive]
8pub enum NetworkId {
9    #[default]
10    Mainnet,
11    Testnet,
12    Canary,
13}
14
15impl std::str::FromStr for NetworkId {
16    type Err = &'static str;
17
18    fn from_str(s: &str) -> Result<Self, Self::Err> {
19        match s {
20            "mainnet" => Ok(Self::Mainnet),
21            "testnet" => Ok(Self::Testnet),
22            "canary" => Ok(Self::Canary),
23            _ => Err("Invalid network ID"),
24        }
25    }
26}
27
28impl std::fmt::Display for NetworkId {
29    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
30        match self {
31            Self::Mainnet => write!(f, "mainnet"),
32            Self::Testnet => write!(f, "testnet"),
33            Self::Canary => write!(f, "canary"),
34        }
35    }
36}
37
38impl DataFormat for NetworkId {
39    type Header = u8;
40    const LATEST_HEADER: Self::Header = 1u8;
41
42    fn write_data<W: std::io::prelude::Write>(
43        &self,
44        writer: &mut W,
45    ) -> Result<usize, crate::format::DataWriteError> {
46        match self {
47            Self::Mainnet => 0u8.write_data(writer),
48            Self::Testnet => 1u8.write_data(writer),
49            Self::Canary => 2u8.write_data(writer),
50        }
51    }
52
53    fn read_data<R: std::io::prelude::Read>(
54        reader: &mut R,
55        header: &Self::Header,
56    ) -> Result<Self, crate::format::DataReadError> {
57        if *header != Self::LATEST_HEADER {
58            return Err(crate::format::DataReadError::unsupported(
59                "network_id",
60                Self::LATEST_HEADER,
61                *header,
62            ));
63        }
64
65        match u8::read_data(reader, &())? {
66            0 => Ok(Self::Mainnet),
67            1 => Ok(Self::Testnet),
68            2 => Ok(Self::Canary),
69            n => Err(crate::format::DataReadError::Custom(format!(
70                "Invalid network ID: {n}"
71            ))),
72        }
73    }
74}