citum_engine/values/
type_label.rs1use crate::reference::Reference;
13use crate::values::{ComponentValues, ProcHints, ProcValues, RenderOptions};
14use citum_schema::locale::TermForm;
15use citum_schema::template::TemplateTypeLabel;
16
17impl ComponentValues for TemplateTypeLabel {
18 fn values<F: crate::render::format::OutputFormat<Output = String>>(
19 &self,
20 reference: &Reference,
21 _hints: &ProcHints,
22 options: &RenderOptions<'_>,
23 ) -> Option<ProcValues<F::Output>> {
24 let effective_rendering = self.rendering.clone();
25
26 let mut value = resolve_type_label_text(reference, options)?;
27
28 if crate::values::should_strip_periods(&effective_rendering, options) {
29 value = crate::values::strip_trailing_periods(&value);
30 }
31
32 if let Some(tc) = effective_rendering.text_case {
33 value = crate::values::text_case::apply_text_case_with_language(
34 &value,
35 tc,
36 Some(options.locale.locale.as_str()),
37 );
38 }
39
40 if value.is_empty() {
41 None
42 } else {
43 Some(ProcValues {
44 value,
45 pre_formatted: false,
46 ..Default::default()
47 })
48 }
49 }
50}
51
52fn resolve_type_label_text(reference: &Reference, options: &RenderOptions<'_>) -> Option<String> {
56 let ref_type = reference.ref_type();
57
58 if let Some(genre) = reference.genre().filter(|genre| *genre != ref_type) {
59 return Some(options.locale.lookup_genre(&genre));
60 }
61
62 if let Some(medium) = reference.medium() {
63 return Some(options.locale.lookup_medium(&medium));
64 }
65
66 options
67 .locale
68 .resolved_type_term(&ref_type, &TermForm::Long)
69}