chryso_metadata/
functions.rs1use crate::types::DataType;
2
3#[derive(Debug, Clone)]
4pub struct FunctionSignature {
5 pub name: String,
6 pub return_type: DataType,
7}
8
9#[derive(Debug, Default)]
10pub struct FunctionRegistry {
11 functions: std::collections::HashMap<String, FunctionSignature>,
12}
13
14impl FunctionRegistry {
15 pub fn new() -> Self {
16 Self {
17 functions: std::collections::HashMap::new(),
18 }
19 }
20
21 pub fn register(&mut self, name: impl Into<String>, return_type: DataType) {
22 let name = name.into();
23 let key = name.to_ascii_lowercase();
24 self.functions
25 .insert(key, FunctionSignature { name, return_type });
26 }
27
28 pub fn is_known(&self, name: &str) -> bool {
29 self.functions.contains_key(&name.to_ascii_lowercase())
30 }
31
32 pub fn return_type(&self, name: &str) -> Option<DataType> {
33 self.functions
34 .get(&name.to_ascii_lowercase())
35 .map(|sig| sig.return_type.clone())
36 }
37
38 pub fn with_builtins() -> Self {
39 let mut registry = FunctionRegistry::new();
40 registry.register("count", DataType::Int);
41 registry.register("sum", DataType::Float);
42 registry.register("avg", DataType::Float);
43 registry.register("min", DataType::Float);
44 registry.register("max", DataType::Float);
45 registry
46 }
47}
48
49#[cfg(test)]
50mod tests {
51 use super::FunctionRegistry;
52 use crate::types::DataType;
53
54 #[test]
55 fn registry_resolves_builtin() {
56 let registry = FunctionRegistry::with_builtins();
57 assert_eq!(registry.return_type("sum"), Some(DataType::Float));
58 }
59}