koios_sdk/
network.rs

1use std::fmt;
2
3/// Available Cardano networks for the Koios API
4#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
5pub enum Network {
6    /// Mainnet - production network
7    #[default]
8    Mainnet,
9    /// Preprod - pre-production test network
10    Preprod,
11    /// Preview - preview test network
12    Preview,
13    /// Guild - community test network
14    Guild,
15}
16
17impl Network {
18    /// Get the base URL for the network
19    pub fn base_url(&self) -> &'static str {
20        match self {
21            Network::Mainnet => "https://api.koios.rest/api/v1",
22            Network::Preprod => "https://preprod.koios.rest/api/v1",
23            Network::Preview => "https://preview.koios.rest/api/v1",
24            Network::Guild => "https://guild.koios.rest/api/v1",
25        }
26    }
27}
28
29impl fmt::Display for Network {
30    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
31        match self {
32            Network::Mainnet => write!(f, "mainnet"),
33            Network::Preprod => write!(f, "preprod"),
34            Network::Preview => write!(f, "preview"),
35            Network::Guild => write!(f, "guild"),
36        }
37    }
38}
39
40impl std::str::FromStr for Network {
41    type Err = String;
42
43    fn from_str(s: &str) -> Result<Self, Self::Err> {
44        match s.to_lowercase().as_str() {
45            "mainnet" => Ok(Network::Mainnet),
46            "preprod" => Ok(Network::Preprod),
47            "preview" => Ok(Network::Preview),
48            "guild" => Ok(Network::Guild),
49            _ => Err(format!("Unknown network: {}", s)),
50        }
51    }
52}
53
54#[cfg(test)]
55mod tests {
56    use super::*;
57    use std::str::FromStr;
58
59    #[test]
60    fn test_network_default() {
61        assert_eq!(Network::default(), Network::Mainnet);
62    }
63
64    #[test]
65    fn test_network_base_urls() {
66        assert_eq!(Network::Mainnet.base_url(), "https://api.koios.rest/api/v1");
67        assert_eq!(
68            Network::Preprod.base_url(),
69            "https://preprod.koios.rest/api/v1"
70        );
71        assert_eq!(
72            Network::Preview.base_url(),
73            "https://preview.koios.rest/api/v1"
74        );
75        assert_eq!(Network::Guild.base_url(), "https://guild.koios.rest/api/v1");
76    }
77
78    #[test]
79    fn test_network_display() {
80        assert_eq!(Network::Mainnet.to_string(), "mainnet");
81        assert_eq!(Network::Preprod.to_string(), "preprod");
82        assert_eq!(Network::Preview.to_string(), "preview");
83        assert_eq!(Network::Guild.to_string(), "guild");
84    }
85
86    #[test]
87    fn test_network_from_str() {
88        assert_eq!(Network::from_str("mainnet").unwrap(), Network::Mainnet);
89        assert_eq!(Network::from_str("PREPROD").unwrap(), Network::Preprod);
90        assert_eq!(Network::from_str("Preview").unwrap(), Network::Preview);
91        assert_eq!(Network::from_str("guild").unwrap(), Network::Guild);
92        assert!(Network::from_str("invalid").is_err());
93    }
94}