use alloc::borrow::Cow;
use crate::{
param::VcardParamKind,
prop::VcardPropKind,
tree::{
codec::VcardCodec,
line::VcardLine,
param::lens::VcardParamLens,
prop::{cardinality::VcardPropCardinality, lens::VcardPropLens, spec::VcardPropSpec},
},
value::{VcardValueKind, gender::VcardGender},
version::VcardVersion,
};
pub struct GENDER;
impl VcardPropLens for GENDER {
type Target<'v> = VcardGender<'v>;
type Cursor<'c, 'a>
= VcardGenderCursor<'c, 'a>
where
'a: 'c;
fn cursor<'c, 'a>(line: &'c mut VcardLine<'a>) -> VcardGenderCursor<'c, 'a> {
VcardGenderCursor { line }
}
}
impl VcardPropSpec for GENDER {
const KIND: VcardPropKind = VcardPropKind::Gender;
fn allowed_versions() -> &'static [VcardVersion] {
&[VcardVersion::V4_0]
}
fn cardinality(_version: VcardVersion) -> VcardPropCardinality {
VcardPropCardinality::AtMostOne
}
fn allowed_values(_version: VcardVersion) -> &'static [VcardValueKind] {
&[VcardValueKind::Gender]
}
fn allowed_params(_version: VcardVersion) -> &'static [VcardParamKind] {
&[VcardParamKind::Value]
}
}
pub struct VcardGenderCursor<'c, 'a> {
pub line: &'c mut VcardLine<'a>,
}
impl VcardGenderCursor<'_, '_> {
pub fn get(&self) -> VcardGender<'_> {
VcardGender::decode(&self.line.value)
}
pub fn sex(&self) -> Cow<'_, str> {
self.line.value.decode_scalar_at(0)
}
pub fn set_sex(&mut self, value: impl AsRef<str>) {
self.line.value.set_at(0, &[value]);
}
pub fn identity(&self) -> Cow<'_, str> {
self.line.value.decode_scalar_at(1)
}
pub fn set_identity(&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>()
}
}