cluster.rs 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. use anyhow::Result;
  2. use std::str::FromStr;
  3. #[derive(Clone, Debug, Eq, PartialEq)]
  4. pub enum Cluster {
  5. Testnet,
  6. Mainnet,
  7. VipMainnet,
  8. Devnet,
  9. Localnet,
  10. Debug,
  11. Custom(String, String),
  12. }
  13. impl Default for Cluster {
  14. fn default() -> Self {
  15. Cluster::Localnet
  16. }
  17. }
  18. impl FromStr for Cluster {
  19. type Err = anyhow::Error;
  20. fn from_str(s: &str) -> Result<Cluster> {
  21. match s.to_lowercase().as_str() {
  22. "t" | "testnet" => Ok(Cluster::Testnet),
  23. "m" | "mainnet" => Ok(Cluster::Mainnet),
  24. "v" | "vipmainnet" => Ok(Cluster::VipMainnet),
  25. "d" | "devnet" => Ok(Cluster::Devnet),
  26. "l" | "localnet" => Ok(Cluster::Localnet),
  27. "g" | "debug" => Ok(Cluster::Debug),
  28. _ => Err(anyhow::Error::msg(
  29. "Cluster must be one of [localnet, testnet, mainnet, devnet] or be an http or https url\n",
  30. )),
  31. }
  32. }
  33. }
  34. impl std::fmt::Display for Cluster {
  35. fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
  36. let clust_str = match self {
  37. Cluster::Testnet => "testnet",
  38. Cluster::Mainnet => "mainnet",
  39. Cluster::VipMainnet => "vipmainnet",
  40. Cluster::Devnet => "devnet",
  41. Cluster::Localnet => "localnet",
  42. Cluster::Debug => "debug",
  43. Cluster::Custom(url, _ws_url) => url,
  44. };
  45. write!(f, "{}", clust_str)
  46. }
  47. }
  48. impl Cluster {
  49. pub fn url(&self) -> &str {
  50. match self {
  51. Cluster::Devnet => "https://devnet.solana.com",
  52. Cluster::Testnet => "https://testnet.solana.com",
  53. Cluster::Mainnet => "https://api.mainnet-beta.solana.com",
  54. Cluster::VipMainnet => "https://vip-api.mainnet-beta.solana.com",
  55. Cluster::Localnet => "http://127.0.0.1:8899",
  56. Cluster::Debug => "http://34.90.18.145:8899",
  57. Cluster::Custom(url, _ws_url) => url,
  58. }
  59. }
  60. pub fn ws_url(&self) -> &str {
  61. match self {
  62. Cluster::Devnet => "wss://devnet.solana.com",
  63. Cluster::Testnet => "wss://testnet.solana.com",
  64. Cluster::Mainnet => "wss://api.mainnet-beta.solana.com",
  65. Cluster::VipMainnet => "wss://vip-api.mainnet-beta.solana.com",
  66. Cluster::Localnet => "ws://127.0.0.1:9000",
  67. Cluster::Debug => "ws://34.90.18.145:9000",
  68. Cluster::Custom(_url, ws_url) => ws_url,
  69. }
  70. }
  71. }
  72. #[cfg(test)]
  73. mod tests {
  74. use super::*;
  75. fn test_cluster(name: &str, cluster: Cluster) {
  76. assert_eq!(Cluster::from_str(name).unwrap(), cluster);
  77. }
  78. #[test]
  79. fn test_cluster_parse() {
  80. test_cluster("testnet", Cluster::Testnet);
  81. test_cluster("mainnet", Cluster::Mainnet);
  82. test_cluster("vipmainnet", Cluster::VipMainnet);
  83. test_cluster("devnet", Cluster::Devnet);
  84. test_cluster("localnet", Cluster::Localnet);
  85. test_cluster("debug", Cluster::Debug);
  86. }
  87. #[test]
  88. #[should_panic]
  89. fn test_cluster_bad_parse() {
  90. let bad_url = "httq://my_custom_url.test.net";
  91. Cluster::from_str(bad_url).unwrap();
  92. }
  93. }