chrono_node/core/
registry.rs1use super::chrono::{Parser, Refiner};
4use super::configuration::Flags;
5
6pub struct ParserEntry {
8 pub upstream: &'static str,
9 pub create: fn(&Flags) -> Box<dyn Parser>,
10}
11
12pub 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
28pub 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}