use crate::{
tree::{codec::mode::VcardEscaper, value::node::VcardValueNode},
value::{VcardValue, VcardValueUnknown},
};
pub mod decode;
pub mod encode;
pub mod escape;
pub mod mode;
pub mod unescape;
pub trait VcardCodec<'v>: Sized {
fn decode(node: &'v VcardValueNode<'_>) -> Self;
fn encode(&self, escaper: VcardEscaper) -> VcardValueNode<'static>;
}
impl<'v> VcardCodec<'v> for VcardValue<'v> {
fn decode(node: &'v VcardValueNode<'_>) -> Self {
VcardValue::Unknown(VcardValueUnknown::decode(node))
}
fn encode(&self, escaper: VcardEscaper) -> VcardValueNode<'static> {
match self {
VcardValue::Text(v) => v.encode(escaper),
VcardValue::TextList(v) => v.encode(escaper),
VcardValue::Uri(v) => v.encode(escaper),
VcardValue::DateAndOrTime(v) => v.encode(escaper),
VcardValue::Timestamp(v) => v.encode(escaper),
VcardValue::LanguageTag(v) => v.encode(escaper),
VcardValue::UtcOffset(v) => v.encode(escaper),
VcardValue::N(v) => v.encode(escaper),
VcardValue::Adr(v) => v.encode(escaper),
VcardValue::Binary(v) => v.encode(escaper),
VcardValue::Gender(v) => v.encode(escaper),
VcardValue::Geo(v) => v.encode(escaper),
VcardValue::Org(v) => v.encode(escaper),
VcardValue::ClientPidMap(v) => v.encode(escaper),
VcardValue::Unknown(v) => v.encode(escaper),
}
}
}