problemreductions/registry/
problem_type.rs1use super::schema::{ProblemSchemaEntry, VariantDimension};
4use super::FieldInfo;
5use std::collections::BTreeMap;
6
7#[derive(Debug, Clone)]
9pub struct ProblemType {
10 pub canonical_name: &'static str,
12 pub display_name: &'static str,
14 pub aliases: &'static [&'static str],
16 pub dimensions: &'static [VariantDimension],
18 pub description: &'static str,
20 pub fields: &'static [FieldInfo],
22}
23
24impl ProblemType {
25 fn from_entry(entry: &'static ProblemSchemaEntry) -> Self {
27 Self {
28 canonical_name: entry.name,
29 display_name: entry.display_name,
30 aliases: entry.aliases,
31 dimensions: entry.dimensions,
32 description: entry.description,
33 fields: entry.fields,
34 }
35 }
36
37 pub fn default_variant(&self) -> BTreeMap<String, String> {
39 self.dimensions
40 .iter()
41 .map(|d| (d.key.to_string(), d.default_value.to_string()))
42 .collect()
43 }
44}
45
46pub fn find_problem_type(name: &str) -> Option<ProblemType> {
48 inventory::iter::<ProblemSchemaEntry>
49 .into_iter()
50 .find(|entry| entry.name == name)
51 .map(ProblemType::from_entry)
52}
53
54pub fn find_problem_type_by_alias(input: &str) -> Option<ProblemType> {
58 let lower = input.to_lowercase();
59 inventory::iter::<ProblemSchemaEntry>
60 .into_iter()
61 .find(|entry| {
62 entry.name.to_lowercase() == lower
63 || entry.aliases.iter().any(|a| a.to_lowercase() == lower)
64 })
65 .map(ProblemType::from_entry)
66}
67
68pub fn problem_types() -> Vec<ProblemType> {
70 let mut types: Vec<ProblemType> = inventory::iter::<ProblemSchemaEntry>
71 .into_iter()
72 .map(ProblemType::from_entry)
73 .collect();
74 types.sort_by_key(|t| t.canonical_name);
75 types
76}
77
78#[cfg(test)]
79#[path = "../unit_tests/registry/problem_type.rs"]
80mod tests;