1use alloc::vec;
8
9use crate::{
10 tree::{
11 codec::{VcardCodec, encode::encode_component, mode::VcardEscaper},
12 value::node::VcardValueNode,
13 },
14 value::geo::VcardGeo,
15};
16
17impl<'v> VcardCodec<'v> for VcardGeo<'v> {
18 fn decode(node: &'v VcardValueNode<'_>) -> Self {
19 if node.escaper == VcardEscaper::V2_1 {
22 let mut parts = node.decode_at(0).into_iter();
23 VcardGeo {
24 latitude: parts.next().unwrap_or_default(),
25 longitude: parts.next().unwrap_or_default(),
26 }
27 } else {
28 VcardGeo {
29 latitude: node.decode_scalar_at(0),
30 longitude: node.decode_scalar_at(1),
31 }
32 }
33 }
34
35 fn encode(&self, escaper: VcardEscaper) -> VcardValueNode<'static> {
36 let components = if escaper == VcardEscaper::V2_1 {
39 vec![encode_component(
40 &[self.latitude.as_ref(), self.longitude.as_ref()],
41 escaper,
42 )]
43 } else {
44 vec![
45 encode_component(&[self.latitude.as_ref()], escaper),
46 encode_component(&[self.longitude.as_ref()], escaper),
47 ]
48 };
49
50 VcardValueNode::from_components(components, escaper)
51 }
52}