p2p/webrtc/signaling_method/
http.rs

1use std::{fmt, str::FromStr};
2
3use binprot_derive::{BinProtRead, BinProtWrite};
4use serde::{Deserialize, Serialize};
5
6use crate::webrtc::Host;
7
8use super::SignalingMethodParseError;
9
10#[derive(BinProtWrite, BinProtRead, Eq, PartialEq, Ord, PartialOrd, Debug, Clone)]
11pub struct HttpSignalingInfo {
12    pub host: Host,
13    pub port: u16,
14}
15
16impl fmt::Display for HttpSignalingInfo {
17    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
18        write!(f, "/{}/{}", self.host, self.port)
19    }
20}
21
22impl From<([u8; 4], u16)> for HttpSignalingInfo {
23    fn from(value: ([u8; 4], u16)) -> Self {
24        Self {
25            host: Host::Ipv4(value.0.into()),
26            port: value.1,
27        }
28    }
29}
30
31impl FromStr for HttpSignalingInfo {
32    type Err = SignalingMethodParseError;
33
34    fn from_str(s: &str) -> Result<Self, Self::Err> {
35        let mut iter = s.split('/').filter(|v| !v.trim().is_empty());
36        let host_str = iter
37            .next()
38            .ok_or(SignalingMethodParseError::NotEnoughArgs)?;
39        let host = Host::from_str(host_str)
40            .map_err(|err| SignalingMethodParseError::HostParseError(err.to_string()))?;
41
42        let port = iter
43            .next()
44            .ok_or(SignalingMethodParseError::NotEnoughArgs)?
45            .parse::<u16>()
46            .map_err(|err| SignalingMethodParseError::PortParseError(err.to_string()))?;
47
48        Ok(Self { host, port })
49    }
50}
51
52impl Serialize for HttpSignalingInfo {
53    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
54    where
55        S: serde::Serializer,
56    {
57        serializer.serialize_str(&self.to_string())
58    }
59}
60
61impl<'de> serde::Deserialize<'de> for HttpSignalingInfo {
62    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
63    where
64        D: serde::Deserializer<'de>,
65    {
66        let s: String = Deserialize::deserialize(deserializer)?;
67        s.parse().map_err(serde::de::Error::custom)
68    }
69}