clone_solana_cluster_type/
lib.rs

1#![cfg_attr(feature = "frozen-abi", feature(min_specialization))]
2#![cfg_attr(docsrs, feature(doc_auto_cfg))]
3#[cfg(feature = "frozen-abi")]
4use clone_solana_frozen_abi_macro::{AbiEnumVisitor, AbiExample};
5use {clone_solana_hash::Hash, std::str::FromStr};
6
7// The order can't align with release lifecycle only to remain ABI-compatible...
8#[cfg_attr(feature = "frozen-abi", derive(AbiExample, AbiEnumVisitor))]
9#[cfg_attr(
10    feature = "serde",
11    derive(serde_derive::Deserialize, serde_derive::Serialize)
12)]
13#[derive(Debug, Clone, Copy, PartialEq, Eq)]
14pub enum ClusterType {
15    Testnet,
16    MainnetBeta,
17    Devnet,
18    Development,
19}
20
21impl ClusterType {
22    pub const STRINGS: [&'static str; 4] = ["development", "devnet", "testnet", "mainnet-beta"];
23
24    /// Get the known genesis hash for this ClusterType
25    pub fn get_genesis_hash(&self) -> Option<Hash> {
26        match self {
27            Self::MainnetBeta => {
28                Some(Hash::from_str("5eykt4UsFv8P8NJdTREpY1vzqKqZKvdpKuc147dw2N9d").unwrap())
29            }
30            Self::Testnet => {
31                Some(Hash::from_str("4uhcVJyU9pJkvQyS88uRDiswHXSCkY3zQawwpjk2NsNY").unwrap())
32            }
33            Self::Devnet => {
34                Some(Hash::from_str("EtWTRABZaYq6iMfeYKouRu166VU2xqa1wcaWoxPkrZBG").unwrap())
35            }
36            Self::Development => None,
37        }
38    }
39}
40
41impl FromStr for ClusterType {
42    type Err = String;
43
44    fn from_str(s: &str) -> Result<Self, Self::Err> {
45        match s {
46            "development" => Ok(ClusterType::Development),
47            "devnet" => Ok(ClusterType::Devnet),
48            "testnet" => Ok(ClusterType::Testnet),
49            "mainnet-beta" => Ok(ClusterType::MainnetBeta),
50            _ => Err(format!("{s} is unrecognized for cluster type")),
51        }
52    }
53}