Skip to main content

ical/tree/param/
gap.rs

1//! # GAP parameter lens
2//!
3//! The `GAP` parameter lens: the lag or lead between two related components
4//! (RFC 9253 6.2).
5
6use alloc::{borrow::Cow, string::ToString, vec};
7
8use crate::{
9    param::IcalParamKind,
10    tree::{
11        codec::{escape::escape_param, mode::Escaper, unescape::unescape_param},
12        leaf::IcalLeaf,
13        param::{lens::IcalParamLens, node::IcalParamNode},
14    },
15};
16
17/// The `GAP` parameter lens.
18#[allow(non_camel_case_types)]
19pub struct GAP;
20
21impl IcalParamLens for GAP {
22    const KIND: IcalParamKind = IcalParamKind::Gap;
23
24    type Target<'v> = Cow<'v, str>;
25
26    fn decode<'v>(param: &'v IcalParamNode<'_>) -> Cow<'v, str> {
27        param
28            .values
29            .first()
30            .map(|value| unescape_param(value.get(), param.escaper))
31            .unwrap_or_default()
32    }
33
34    fn encode(decoded: &Cow<'_, str>, escaper: Escaper) -> IcalParamNode<'static> {
35        IcalParamNode {
36            name: IcalLeaf::from(Self::KIND.to_string()),
37            values: vec![IcalLeaf::from(escape_param(decoded, escaper).into_owned())],
38            escaper,
39        }
40    }
41}