use alloc::{borrow::Cow, vec::Vec};
use crate::{
param::VcardParamKind,
prop::VcardPropKind,
tree::{
codec::VcardCodec,
line::VcardLine,
param::lens::VcardParamLens,
prop::{lens::VcardPropLens, spec::VcardPropSpec},
},
value::{VcardValueKind, adr::VcardAdr},
version::VcardVersion,
};
pub struct ADR;
impl VcardPropLens for ADR {
type Target<'v> = VcardAdr<'v>;
type Cursor<'c, 'a>
= VcardAdrCursor<'c, 'a>
where
'a: 'c;
fn cursor<'c, 'a>(line: &'c mut VcardLine<'a>) -> VcardAdrCursor<'c, 'a> {
VcardAdrCursor { line }
}
}
impl VcardPropSpec for ADR {
const KIND: VcardPropKind = VcardPropKind::Adr;
fn allowed_values(_version: VcardVersion) -> &'static [VcardValueKind] {
&[VcardValueKind::Adr]
}
fn allowed_params(_version: VcardVersion) -> &'static [VcardParamKind] {
&[
VcardParamKind::Label,
VcardParamKind::Language,
VcardParamKind::Phonetic,
VcardParamKind::Script,
VcardParamKind::Geo,
VcardParamKind::Tz,
VcardParamKind::AltId,
VcardParamKind::Pid,
VcardParamKind::Pref,
VcardParamKind::Type,
VcardParamKind::Value,
]
}
}
pub struct VcardAdrCursor<'c, 'a> {
pub line: &'c mut VcardLine<'a>,
}
impl VcardAdrCursor<'_, '_> {
pub fn get(&self) -> VcardAdr<'_> {
VcardAdr::decode(&self.line.value)
}
pub fn po_box(&self) -> Vec<Cow<'_, str>> {
self.line.value.decode_at(0)
}
pub fn set_po_box<S: AsRef<str>>(&mut self, values: &[S]) {
self.line.value.set_at(0, values);
}
pub fn extended(&self) -> Vec<Cow<'_, str>> {
self.line.value.decode_at(1)
}
pub fn set_extended<S: AsRef<str>>(&mut self, values: &[S]) {
self.line.value.set_at(1, values);
}
pub fn street(&self) -> Vec<Cow<'_, str>> {
self.line.value.decode_at(2)
}
pub fn set_street<S: AsRef<str>>(&mut self, values: &[S]) {
self.line.value.set_at(2, values);
}
pub fn locality(&self) -> Vec<Cow<'_, str>> {
self.line.value.decode_at(3)
}
pub fn set_locality<S: AsRef<str>>(&mut self, values: &[S]) {
self.line.value.set_at(3, values);
}
pub fn region(&self) -> Vec<Cow<'_, str>> {
self.line.value.decode_at(4)
}
pub fn set_region<S: AsRef<str>>(&mut self, values: &[S]) {
self.line.value.set_at(4, values);
}
pub fn postal_code(&self) -> Vec<Cow<'_, str>> {
self.line.value.decode_at(5)
}
pub fn set_postal_code<S: AsRef<str>>(&mut self, values: &[S]) {
self.line.value.set_at(5, values);
}
pub fn country(&self) -> Vec<Cow<'_, str>> {
self.line.value.decode_at(6)
}
pub fn set_country<S: AsRef<str>>(&mut self, values: &[S]) {
self.line.value.set_at(6, values);
}
pub fn room(&self) -> Vec<Cow<'_, str>> {
self.line.value.decode_at(7)
}
pub fn set_room<S: AsRef<str>>(&mut self, values: &[S]) {
self.line.value.set_at(7, values);
}
pub fn apartment(&self) -> Vec<Cow<'_, str>> {
self.line.value.decode_at(8)
}
pub fn set_apartment<S: AsRef<str>>(&mut self, values: &[S]) {
self.line.value.set_at(8, values);
}
pub fn floor(&self) -> Vec<Cow<'_, str>> {
self.line.value.decode_at(9)
}
pub fn set_floor<S: AsRef<str>>(&mut self, values: &[S]) {
self.line.value.set_at(9, values);
}
pub fn street_number(&self) -> Vec<Cow<'_, str>> {
self.line.value.decode_at(10)
}
pub fn set_street_number<S: AsRef<str>>(&mut self, values: &[S]) {
self.line.value.set_at(10, values);
}
pub fn street_name(&self) -> Vec<Cow<'_, str>> {
self.line.value.decode_at(11)
}
pub fn set_street_name<S: AsRef<str>>(&mut self, values: &[S]) {
self.line.value.set_at(11, values);
}
pub fn building(&self) -> Vec<Cow<'_, str>> {
self.line.value.decode_at(12)
}
pub fn set_building<S: AsRef<str>>(&mut self, values: &[S]) {
self.line.value.set_at(12, values);
}
pub fn block(&self) -> Vec<Cow<'_, str>> {
self.line.value.decode_at(13)
}
pub fn set_block<S: AsRef<str>>(&mut self, values: &[S]) {
self.line.value.set_at(13, values);
}
pub fn subdistrict(&self) -> Vec<Cow<'_, str>> {
self.line.value.decode_at(14)
}
pub fn set_subdistrict<S: AsRef<str>>(&mut self, values: &[S]) {
self.line.value.set_at(14, values);
}
pub fn district(&self) -> Vec<Cow<'_, str>> {
self.line.value.decode_at(15)
}
pub fn set_district<S: AsRef<str>>(&mut self, values: &[S]) {
self.line.value.set_at(15, values);
}
pub fn landmark(&self) -> Vec<Cow<'_, str>> {
self.line.value.decode_at(16)
}
pub fn set_landmark<S: AsRef<str>>(&mut self, values: &[S]) {
self.line.value.set_at(16, values);
}
pub fn direction(&self) -> Vec<Cow<'_, str>> {
self.line.value.decode_at(17)
}
pub fn set_direction<S: AsRef<str>>(&mut self, values: &[S]) {
self.line.value.set_at(17, values);
}
pub fn param<P: VcardParamLens>(&self) -> Option<P::Target<'_>> {
self.line.param::<P>()
}
}