Skip to main content

chrono_node/core/
registry.rs

1//! The auto-generated registry of ported parsers and refiners (see `build.rs`).
2
3use super::chrono::{Parser, Refiner};
4use super::configuration::Flags;
5
6/// A registrable parser file: `pub const UPSTREAM` + `pub fn create`.
7pub struct ParserEntry {
8    pub upstream: &'static str,
9    pub create: fn(&Flags) -> Box<dyn Parser>,
10}
11
12/// A registrable refiner file: `pub const UPSTREAM` + `pub fn create`.
13pub struct RefinerEntry {
14    pub upstream: &'static str,
15    pub create: fn(&Flags) -> Box<dyn Refiner>,
16}
17
18include!(concat!(env!("OUT_DIR"), "/registry/all.rs"));
19
20pub fn find_parser(upstream: &str) -> Option<&'static ParserEntry> {
21    all_parsers().into_iter().find(|e| e.upstream == upstream)
22}
23
24pub fn find_refiner(upstream: &str) -> Option<&'static RefinerEntry> {
25    all_refiners().into_iter().find(|e| e.upstream == upstream)
26}
27
28/// Upstream names of every ported parser and refiner.
29pub fn ported() -> Vec<&'static str> {
30    let mut names: Vec<&'static str> = all_parsers()
31        .iter()
32        .map(|e| e.upstream)
33        .chain(all_refiners().iter().map(|e| e.upstream))
34        .collect();
35    names.sort_unstable();
36    names
37}
38
39#[cfg(test)]
40mod tests {
41    use super::*;
42
43    #[test]
44    fn upstream_names_are_unique() {
45        let names = ported();
46        let mut dedup = names.clone();
47        dedup.dedup();
48        assert_eq!(names, dedup, "two files claim the same UPSTREAM class");
49    }
50}