p2p/webrtc/signaling_method/
http.rs1use 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}