solana_cli_output/
cli_version.rs

1use {
2    serde::{Deserialize, Deserializer, Serialize, Serializer},
3    std::{fmt, str::FromStr},
4};
5
6#[derive(Default, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Clone)]
7pub struct CliVersion(Option<semver::Version>);
8
9impl CliVersion {
10    pub fn unknown_version() -> Self {
11        Self(None)
12    }
13}
14
15impl fmt::Display for CliVersion {
16    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
17        let s = match &self.0 {
18            None => "unknown".to_string(),
19            Some(version) => version.to_string(),
20        };
21        write!(f, "{s}")
22    }
23}
24
25impl From<semver::Version> for CliVersion {
26    fn from(version: semver::Version) -> Self {
27        Self(Some(version))
28    }
29}
30
31impl FromStr for CliVersion {
32    type Err = semver::Error;
33    fn from_str(s: &str) -> Result<Self, Self::Err> {
34        let version_option = if s == "unknown" {
35            None
36        } else {
37            Some(semver::Version::from_str(s)?)
38        };
39        Ok(CliVersion(version_option))
40    }
41}
42
43impl Serialize for CliVersion {
44    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
45    where
46        S: Serializer,
47    {
48        serializer.serialize_str(&self.to_string())
49    }
50}
51
52impl<'de> Deserialize<'de> for CliVersion {
53    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
54    where
55        D: Deserializer<'de>,
56    {
57        let s: &str = Deserialize::deserialize(deserializer)?;
58        CliVersion::from_str(s).map_err(serde::de::Error::custom)
59    }
60}