Skip to main content

citum_engine/values/
term.rs

1/*
2SPDX-License-Identifier: MIT OR Apache-2.0
3SPDX-FileCopyrightText: © 2023-2026 Bruce D'Arcus and Citum contributors
4*/
5
6//! Rendering logic for localized term components.
7//!
8//! This module handles term component rendering with locale-aware lookup
9//! and proper text handling for plural/singular forms.
10
11use crate::reference::Reference;
12use crate::values::{ComponentValues, ProcHints, ProcValues, RenderOptions};
13use citum_schema::locale::TermForm;
14use citum_schema::template::TemplateTerm;
15
16impl ComponentValues for TemplateTerm {
17    fn values<F: crate::render::format::OutputFormat<Output = String>>(
18        &self,
19        _reference: &Reference,
20        _hints: &ProcHints,
21        options: &RenderOptions<'_>,
22    ) -> Option<ProcValues<F::Output>> {
23        let effective_rendering = self.rendering.clone();
24
25        let form = self.form.clone().unwrap_or(TermForm::Long);
26        let mut value = options
27            .locale
28            .resolved_general_term(&self.term, &form, self.gender.clone())
29            .unwrap_or_default();
30
31        // Apply strip-periods if configured
32        if crate::values::should_strip_periods(&effective_rendering, options) {
33            value = crate::values::strip_trailing_periods(&value);
34        }
35
36        // Apply text-case if configured
37        if let Some(tc) = effective_rendering.text_case {
38            value = crate::values::text_case::apply_text_case_with_language(
39                &value,
40                tc,
41                Some(options.locale.locale.as_str()),
42            );
43        }
44
45        if value.is_empty() {
46            None
47        } else {
48            Some(ProcValues {
49                value,
50                pre_formatted: false,
51                ..Default::default()
52            })
53        }
54    }
55}