use std::marker::PhantomData;
use super::{percent::decode_percents_str, DBusAddr, Error, KeyValFmt, Result, TransportImpl};
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct Vsock<'a> {
cid: Option<u32>,
port: Option<u32>,
phantom: PhantomData<&'a ()>,
}
impl<'a> Vsock<'a> {
pub fn port(&self) -> Option<u32> {
self.port
}
pub fn cid(&self) -> Option<u32> {
self.cid
}
pub fn into_owned(self) -> Vsock<'static> {
Vsock {
cid: self.cid,
port: self.port,
phantom: PhantomData,
}
}
}
impl<'a> TransportImpl<'a> for Vsock<'a> {
fn for_address(s: &'a DBusAddr<'a>) -> Result<Self> {
let mut port = None;
let mut cid = None;
for (k, v) in s.key_val_iter() {
match (k, v) {
("port", Some(v)) => {
port = Some(
decode_percents_str(v)?
.parse()
.map_err(|_| Error::InvalidValue(k.into()))?,
);
}
("cid", Some(v)) => {
cid = Some(
decode_percents_str(v)?
.parse()
.map_err(|_| Error::InvalidValue(k.into()))?,
)
}
_ => continue,
}
}
Ok(Vsock {
port,
cid,
phantom: PhantomData,
})
}
fn fmt_key_val<'s: 'b, 'b>(&'s self, kv: KeyValFmt<'b>) -> KeyValFmt<'b> {
kv.add("cid", self.cid()).add("port", self.port())
}
}