Skip to main content

chryso_metadata/
functions.rs

1use 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}