Skip to main content

ical/tree/value/
text.rs

1//! # Text value codec (RFC 5545 3.3.11)
2//!
3//! [`Codec`] for a single text value and a comma-separated text list.
4
5use alloc::vec;
6
7use crate::{
8    tree::{
9        codec::{
10            Codec,
11            encode::{encode_component, scalar_node},
12            mode::Escaper,
13        },
14        value::IcalValueNode,
15    },
16    value::text::{IcalText, IcalTextList},
17};
18
19impl<'v> Codec<'v> for IcalText<'v> {
20    fn decode(node: &'v IcalValueNode<'_>) -> Self {
21        // NOTE: A single text value has no list to be separated into, so an
22        // unescaped comma in one is data rather than a separator. RFC 5545
23        // 3.3.11 says it should have been escaped; truncating the value at it
24        // would be strictness applied to the wrong end of Postel's law.
25        IcalText(node.decode_joined_at(0))
26    }
27
28    fn encode(&self, escaper: Escaper) -> IcalValueNode<'static> {
29        scalar_node(&self.0, escaper)
30    }
31}
32
33impl<'v> Codec<'v> for IcalTextList<'v> {
34    fn decode(node: &'v IcalValueNode<'_>) -> Self {
35        IcalTextList(node.decode_at(0))
36    }
37
38    fn encode(&self, escaper: Escaper) -> IcalValueNode<'static> {
39        IcalValueNode::from_components(vec![encode_component(&self.0, escaper)], escaper)
40    }
41}