Skip to main content

es_fluent_shared/resource/
route.rs

1use crate::fluent::FluentDomain;
2use crate::namespace::ResolvedNamespace;
3use crate::registry::StaticFluentDomain;
4
5use super::ModuleResourceSpec;
6
7/// Canonical route for a crate resource before it is expanded for a locale.
8#[derive(Clone, Debug, Eq, Hash, PartialEq)]
9pub enum ResourceRoute {
10    /// The base crate resource, written as `{domain}.ftl`.
11    Base,
12    /// A namespaced crate resource, written under `{domain}/{namespace}.ftl`.
13    Namespaced(ResolvedNamespace),
14}
15
16impl ResourceRoute {
17    /// Creates a route from an optional resolved namespace.
18    pub fn from_namespace(namespace: Option<ResolvedNamespace>) -> Self {
19        match namespace {
20            Some(namespace) => Self::Namespaced(namespace),
21            None => Self::Base,
22        }
23    }
24
25    /// Returns true when this route points at the base crate resource.
26    pub fn is_base(&self) -> bool {
27        matches!(self, Self::Base)
28    }
29
30    /// Builds the concrete module resource specification for a crate domain.
31    pub fn resource_spec(&self, domain: &str, required: bool) -> ModuleResourceSpec {
32        let domain =
33            FluentDomain::try_new(domain).expect("resource route domain should be validated");
34        self.resource_spec_for_domain(&domain, required)
35    }
36
37    /// Builds the concrete module resource specification for a validated crate domain.
38    pub fn resource_spec_for_static_domain(
39        &self,
40        domain: StaticFluentDomain,
41        required: bool,
42    ) -> ModuleResourceSpec {
43        match self {
44            Self::Base => ModuleResourceSpec::base_for_static_domain(domain, required),
45            Self::Namespaced(namespace) => {
46                ModuleResourceSpec::namespaced_for_static_domain(domain, namespace, required)
47            },
48        }
49    }
50
51    fn resource_spec_for_domain(
52        &self,
53        domain: &FluentDomain,
54        required: bool,
55    ) -> ModuleResourceSpec {
56        match self {
57            Self::Base => ModuleResourceSpec::base_for_domain(domain, required),
58            Self::Namespaced(namespace) => {
59                ModuleResourceSpec::namespaced_for_domain(domain, namespace, required)
60            },
61        }
62    }
63}