node_launchpad/
connection_mode.rs

1use std::fmt::{Display, Formatter, Result};
2
3use ant_service_management::NodeServiceData;
4use serde::{Deserialize, Serialize};
5use strum::{Display, EnumIter};
6
7#[derive(Clone, Copy, Debug, Default, EnumIter, Eq, Hash, PartialEq)]
8pub enum ConnectionMode {
9    #[default]
10    Automatic,
11    HomeNetwork,
12    UPnP,
13    CustomPorts,
14}
15
16impl Display for ConnectionMode {
17    fn fmt(&self, f: &mut Formatter) -> Result {
18        match self {
19            ConnectionMode::HomeNetwork => write!(f, "Home Network"),
20            ConnectionMode::UPnP => write!(f, "UPnP"),
21            ConnectionMode::CustomPorts => write!(f, "Custom Ports"),
22            ConnectionMode::Automatic => write!(f, "Automatic"),
23        }
24    }
25}
26
27impl<'de> Deserialize<'de> for ConnectionMode {
28    fn deserialize<D>(deserializer: D) -> std::result::Result<ConnectionMode, D::Error>
29    where
30        D: serde::Deserializer<'de>,
31    {
32        let s = String::deserialize(deserializer)?;
33        match s.as_str() {
34            "Home Network" => Ok(ConnectionMode::HomeNetwork),
35            "UPnP" => Ok(ConnectionMode::UPnP),
36            "Custom Ports" => Ok(ConnectionMode::CustomPorts),
37            "Automatic" => Ok(ConnectionMode::Automatic),
38            _ => Err(serde::de::Error::custom(format!(
39                "Invalid ConnectionMode: {s:?}"
40            ))),
41        }
42    }
43}
44
45impl Serialize for ConnectionMode {
46    fn serialize<S>(&self, serializer: S) -> std::result::Result<S::Ok, S::Error>
47    where
48        S: serde::Serializer,
49    {
50        let s = match self {
51            ConnectionMode::HomeNetwork => "Home Network",
52            ConnectionMode::UPnP => "UPnP",
53            ConnectionMode::CustomPorts => "Custom Ports",
54            ConnectionMode::Automatic => "Automatic",
55        };
56        serializer.serialize_str(s)
57    }
58}
59
60#[derive(Default, Debug, Clone, Serialize, Display)]
61pub enum NodeConnectionMode {
62    UPnP,
63    Relay,
64    Manual,
65    #[default]
66    Unknown,
67}
68
69impl From<&NodeServiceData> for NodeConnectionMode {
70    fn from(nsd: &NodeServiceData) -> Self {
71        match (nsd.upnp, nsd.home_network) {
72            (true, false) => Self::UPnP,
73            (false, true) => Self::Relay,
74            (false, false) => Self::Manual,
75            _ => Self::Unknown,
76        }
77    }
78}