Skip to main content

solana_cli_output/
cli_clientid.rs

1use {
2    serde::{Deserialize, Deserializer, Serialize, Serializer},
3    std::fmt,
4};
5
6#[derive(Default, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Clone)]
7pub struct CliClientId(Option<String>);
8
9impl CliClientId {
10    pub fn unknown() -> Self {
11        Self(None)
12    }
13}
14
15impl fmt::Display for CliClientId {
16    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
17        match &self.0 {
18            Some(id) => write!(f, "{id}"),
19            None => write!(f, "Unknown"),
20        }
21    }
22}
23
24impl From<Option<String>> for CliClientId {
25    fn from(id: Option<String>) -> Self {
26        Self(id)
27    }
28}
29
30impl Serialize for CliClientId {
31    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
32        // Serialize as a plain string so it can be a JSON map key
33        serializer.serialize_str(&self.to_string())
34    }
35}
36
37impl<'de> Deserialize<'de> for CliClientId {
38    fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
39        let s = String::deserialize(deserializer)?;
40        if s == "Unknown" {
41            Ok(Self(None))
42        } else {
43            Ok(Self(Some(s)))
44        }
45    }
46}