Skip to main content

ical/tree/param/
derived.rs

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