types.rs 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. use serde::{Deserialize, Serialize};
  2. #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
  3. pub enum DomainStatus {
  4. Available,
  5. Registered { expiry: Option<String> },
  6. Error { kind: ErrorKind, message: String },
  7. }
  8. #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
  9. pub enum ErrorKind {
  10. InvalidTld,
  11. Unknown,
  12. Timeout,
  13. RateLimit,
  14. Forbidden,
  15. }
  16. impl ErrorKind {
  17. /// parse from config string (case insensitive, underscores and hyphens both work)
  18. pub fn from_config_str(s: &str) -> Option<Self> {
  19. match s.to_lowercase().replace('-', "_").as_str() {
  20. "invalid_tld" | "invalidtld" => Some(ErrorKind::InvalidTld),
  21. "unknown" => Some(ErrorKind::Unknown),
  22. "timeout" => Some(ErrorKind::Timeout),
  23. "rate_limit" | "ratelimit" => Some(ErrorKind::RateLimit),
  24. "forbidden" => Some(ErrorKind::Forbidden),
  25. _ => None,
  26. }
  27. }
  28. /// back to config string
  29. pub fn to_config_str(&self) -> &'static str {
  30. match self {
  31. ErrorKind::InvalidTld => "invalid_tld",
  32. ErrorKind::Unknown => "unknown",
  33. ErrorKind::Timeout => "timeout",
  34. ErrorKind::RateLimit => "rate_limit",
  35. ErrorKind::Forbidden => "forbidden",
  36. }
  37. }
  38. }
  39. #[derive(Debug, Clone, Serialize, Deserialize)]
  40. pub struct DomainResult {
  41. pub name: String,
  42. pub tld: String,
  43. pub full: String,
  44. pub status: DomainStatus,
  45. }
  46. impl DomainResult {
  47. pub fn new(name: &str, tld: &str, status: DomainStatus) -> Self {
  48. Self {
  49. name: name.to_string(),
  50. tld: tld.to_string(),
  51. full: format!("{}.{}", name, tld),
  52. status,
  53. }
  54. }
  55. pub fn is_available(&self) -> bool {
  56. matches!(self.status, DomainStatus::Available)
  57. }
  58. pub fn is_error(&self) -> bool {
  59. matches!(self.status, DomainStatus::Error { .. })
  60. }
  61. pub fn status_str(&self) -> &str {
  62. match &self.status {
  63. DomainStatus::Available => "available",
  64. DomainStatus::Registered { .. } => "registered",
  65. DomainStatus::Error { .. } => "error",
  66. }
  67. }
  68. pub fn note_str(&self) -> String {
  69. match &self.status {
  70. DomainStatus::Available => "-".to_string(),
  71. DomainStatus::Registered { expiry } => match expiry {
  72. Some(date) => format!("until {}", date),
  73. None => "no expiry info".to_string(),
  74. },
  75. DomainStatus::Error { kind, message } => match kind {
  76. ErrorKind::InvalidTld => "invalid tld".to_string(),
  77. _ => message.clone(),
  78. },
  79. }
  80. }
  81. }