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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
use crate::utils::CustomErr;
use std::{env, error::Error, fmt::Display};

const NETWORK_ENV_NAME: &str = "network";

pub enum Network {
    Testnet,
    Mainnet,
    Devnet,
    Custom(String),
}

pub fn default() -> Network {
    from_env()
}

pub fn from_env() -> Network {
    if env::var_os(NETWORK_ENV_NAME).is_some() {
        if let Ok(value) = env::var(NETWORK_ENV_NAME) {
            return Network::from_name(value);
        }
    }
    Network::Mainnet
}

impl Network {
    pub fn from_name(name: String) -> Self {
        if name.eq("testnet") {
            return Network::Testnet;
        } else if name.eq("devnet") {
            return Network::Devnet;
        } else if name.eq("mainnet") {
            return Network::Mainnet;
        } else {
            return Network::Custom(name);
        }
    }

    pub fn get_gateway(&self) -> String {
        match self {
            Network::Testnet => String::from("https://fullnode.testnet.sui.io:443"),
            Network::Mainnet => String::from("https://fullnode.mainnet.sui.io:443"),
            Network::Devnet => String::from("https://fullnode.devnet.sui.io:443"),
            Network::Custom(url) => url.clone(),
        }
    }

    pub fn faucet_url(&self) -> Result<String, Box<dyn Error>> {
        match self {
            Network::Devnet => Ok("https://faucet.devnet.sui.io/gas".to_string()),
            Network::Testnet => Ok("https://faucet.testnet.sui.io/gas".to_string()),
            Network::Mainnet => Err(Box::new(CustomErr::new("mainnet does not support faucet"))),
            Network::Custom(url) => Ok(format!("{}/gas", url)),
        }
    }

    pub fn to_string(&self) -> String {
        match self {
            Network::Testnet => String::from("testnet"),
            Network::Mainnet => String::from("mainnet"),
            Network::Devnet => String::from("devnet"),
            Network::Custom(url) => url.clone(),
        }
    }

    pub fn object_link(&self, object_id: &String) -> String {
        format!(
            "https://suiexplorer.com/object/{}?network={}",
            object_id,
            self.to_string()
        )
    }

    pub fn transaction_link(&self, digest: &String) -> String {
        format!(
            "https://suiexplorer.com/txblock/{}?network={}",
            digest,
            self.to_string()
        )
    }
}

impl Display for Network {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        write!(f, "[{}, {}]", self.to_string(), self.get_gateway())
    }
}