snops_common/state/
network.rs1use 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}