use alloc::borrow::Cow;
use crate::{
param::VcardParamKind,
prop::VcardPropKind,
tree::{
codec::VcardCodec,
line::VcardLine,
param::lens::VcardParamLens,
prop::{lens::VcardPropLens, spec::VcardPropSpec},
},
value::{VcardValueKind, client_pid_map::VcardClientPidMap},
version::VcardVersion,
};
pub struct CLIENTPIDMAP;
impl VcardPropLens for CLIENTPIDMAP {
type Target<'v> = VcardClientPidMap<'v>;
type Cursor<'c, 'a>
= VcardClientPidMapCursor<'c, 'a>
where
'a: 'c;
fn cursor<'c, 'a>(line: &'c mut VcardLine<'a>) -> VcardClientPidMapCursor<'c, 'a> {
VcardClientPidMapCursor { line }
}
}
impl VcardPropSpec for CLIENTPIDMAP {
const KIND: VcardPropKind = VcardPropKind::ClientPidMap;
fn allowed_versions() -> &'static [VcardVersion] {
&[VcardVersion::V4_0]
}
fn allowed_values(_version: VcardVersion) -> &'static [VcardValueKind] {
&[VcardValueKind::ClientPidMap]
}
fn allowed_params(_version: VcardVersion) -> &'static [VcardParamKind] {
&[]
}
}
pub struct VcardClientPidMapCursor<'c, 'a> {
pub line: &'c mut VcardLine<'a>,
}
impl VcardClientPidMapCursor<'_, '_> {
pub fn get(&self) -> VcardClientPidMap<'_> {
VcardClientPidMap::decode(&self.line.value)
}
pub fn id(&self) -> Cow<'_, str> {
self.line.value.decode_scalar_at(0)
}
pub fn set_id(&mut self, value: impl AsRef<str>) {
self.line.value.set_at(0, &[value]);
}
pub fn uri(&self) -> Cow<'_, str> {
self.line.value.decode_scalar_at(1)
}
pub fn set_uri(&mut self, value: impl AsRef<str>) {
self.line.value.set_at(1, &[value]);
}
pub fn param<P: VcardParamLens>(&self) -> Option<P::Target<'_>> {
self.line.param::<P>()
}
}