Skip to main content

mpl_lang/
stdlib.rs

1//! Standard library module.
2use std::{collections::HashMap, sync::LazyLock};
3
4use crate::{
5    linker::{FunctionId, Module, ModuleId},
6    types::{BucketType, ComputeType, ConversionMethod, MapType, TagsType, TimeType},
7};
8/// `MPL` standard Library
9pub static STDLIB: LazyLock<Module> = LazyLock::new(|| {
10    let mut mapping_functions = HashMap::new();
11    mapping_functions.insert(FunctionId::new("rate"), MapType::Rate.into());
12    mapping_functions.insert(FunctionId::new("increase"), MapType::Increase.into());
13    mapping_functions.insert(FunctionId::new("max"), MapType::Max.into());
14    mapping_functions.insert(FunctionId::new("min"), MapType::Min.into());
15    mapping_functions.insert(FunctionId::new("abs"), MapType::Abs.into());
16    // eval functions
17    mapping_functions.insert(FunctionId::new("+"), MapType::Add.into());
18    mapping_functions.insert(FunctionId::new("-"), MapType::Sub.into());
19    mapping_functions.insert(FunctionId::new("*"), MapType::Mul.into());
20    mapping_functions.insert(FunctionId::new("/"), MapType::Div.into());
21    let mut align_functions = HashMap::new();
22    align_functions.insert(FunctionId::new("min"), TimeType::Min.into());
23    align_functions.insert(FunctionId::new("max"), TimeType::Max.into());
24    align_functions.insert(FunctionId::new("avg"), TimeType::Avg.into());
25    align_functions.insert(FunctionId::new("sum"), TimeType::Sum.into());
26    align_functions.insert(FunctionId::new("count"), TimeType::Count.into());
27    align_functions.insert(FunctionId::new("last"), TimeType::Last.into());
28    let mut group_functions = HashMap::new();
29    group_functions.insert(FunctionId::new("min"), TagsType::Min.into());
30    group_functions.insert(FunctionId::new("max"), TagsType::Max.into());
31    group_functions.insert(FunctionId::new("avg"), TagsType::Avg.into());
32    group_functions.insert(FunctionId::new("sum"), TagsType::Sum.into());
33    group_functions.insert(FunctionId::new("count"), TagsType::Count.into());
34    let mut bucket_functions = HashMap::new();
35    bucket_functions.insert(FunctionId::new("histogram"), BucketType::Histogram);
36    bucket_functions.insert(
37        FunctionId::new("interpolate_delta_histogram"),
38        BucketType::InterpolateDeltaHistogram,
39    );
40    bucket_functions.insert(
41        FunctionId::new("interpolate_cumulative_histogram"),
42        // Docs will print both rate and increase
43        BucketType::InterpolateCumulativeHistogram(ConversionMethod::Rate),
44    );
45    let mut compute_functions = HashMap::new();
46    compute_functions.insert(FunctionId::new("min"), ComputeType::Min.into());
47    compute_functions.insert(FunctionId::new("max"), ComputeType::Max.into());
48    compute_functions.insert(FunctionId::new("avg"), ComputeType::Avg.into());
49    compute_functions.insert(FunctionId::new("/"), ComputeType::Div.into());
50    compute_functions.insert(FunctionId::new("*"), ComputeType::Mul.into());
51    compute_functions.insert(FunctionId::new("+"), ComputeType::Add.into());
52    compute_functions.insert(FunctionId::new("-"), ComputeType::Sub.into());
53
54    let mut prom_align_functions = HashMap::new();
55    prom_align_functions.insert(FunctionId::new("rate"), TimeType::Rate.into());
56    let prom = Module {
57        name: ModuleId::new("prom"),
58        doc: "Prometheus compatibility functions",
59        submodules: HashMap::new(),
60        align_functions: prom_align_functions,
61        mapping_functions: HashMap::new(),
62        group_functions: HashMap::new(),
63        compute_functions: HashMap::new(),
64        bucket_functions: HashMap::new(),
65    };
66
67    let mut interpolate_map_functions = HashMap::new();
68    interpolate_map_functions.insert(FunctionId::new("linear"), MapType::InterpolateLinear.into());
69    let interpolate = Module {
70        name: ModuleId::new("interpolate"),
71        doc: "Interpolation functions",
72        submodules: HashMap::new(),
73        align_functions: HashMap::new(),
74        mapping_functions: interpolate_map_functions,
75        group_functions: HashMap::new(),
76        compute_functions: HashMap::new(),
77        bucket_functions: HashMap::new(),
78    };
79
80    let mut interpolate_filter_functions = HashMap::new();
81    interpolate_filter_functions.insert(FunctionId::new("lt"), MapType::FilterLt.into());
82    interpolate_filter_functions.insert(FunctionId::new("gt"), MapType::FilterGt.into());
83    interpolate_filter_functions.insert(FunctionId::new("lte"), MapType::FilterLe.into());
84    interpolate_filter_functions.insert(FunctionId::new("gte"), MapType::FilterGe.into());
85    interpolate_filter_functions.insert(FunctionId::new("eq"), MapType::FilterEq.into());
86    interpolate_filter_functions.insert(FunctionId::new("neq"), MapType::FilterNe.into());
87
88    let filter = Module {
89        name: ModuleId::new("filter"),
90        doc: "Filter functions, remove non matching datapoints from a time series",
91        submodules: HashMap::new(),
92        align_functions: HashMap::new(),
93        mapping_functions: interpolate_filter_functions,
94        group_functions: HashMap::new(),
95        compute_functions: HashMap::new(),
96        bucket_functions: HashMap::new(),
97    };
98
99    let mut interpolate_is_functions = HashMap::new();
100    interpolate_is_functions.insert(FunctionId::new("lt"), MapType::IsLt.into());
101    interpolate_is_functions.insert(FunctionId::new("gt"), MapType::IsGt.into());
102    interpolate_is_functions.insert(FunctionId::new("lte"), MapType::IsLe.into());
103    interpolate_is_functions.insert(FunctionId::new("gte"), MapType::IsGe.into());
104    interpolate_is_functions.insert(FunctionId::new("eq"), MapType::IsEq.into());
105    interpolate_is_functions.insert(FunctionId::new("neq"), MapType::IsNe.into());
106
107    let is = Module {
108        name: ModuleId::new("is"),
109        doc: "Test functions, set the value of matching datapoints to 1, and non matching datapoints to 0",
110        submodules: HashMap::new(),
111        align_functions: HashMap::new(),
112        mapping_functions: interpolate_is_functions,
113        group_functions: HashMap::new(),
114        compute_functions: HashMap::new(),
115        bucket_functions: HashMap::new(),
116    };
117
118    let mut fill_map_functions = HashMap::new();
119    fill_map_functions.insert(FunctionId::new("prev"), MapType::FillPrev.into());
120    fill_map_functions.insert(FunctionId::new("const"), MapType::FillConst.into());
121    let fill = Module {
122        name: ModuleId::new("fill"),
123        doc: "Functions to fill not set datapoints with values",
124        submodules: HashMap::new(),
125        align_functions: HashMap::new(),
126        mapping_functions: fill_map_functions,
127        group_functions: HashMap::new(),
128        compute_functions: HashMap::new(),
129        bucket_functions: HashMap::new(),
130    };
131
132    let mut submodules = HashMap::new();
133    submodules.insert(ModuleId::new("prom"), prom);
134    submodules.insert(ModuleId::new("interpolate"), interpolate);
135    submodules.insert(ModuleId::new("filter"), filter);
136    submodules.insert(ModuleId::new("is"), is);
137    submodules.insert(ModuleId::new("fill"), fill);
138
139    Module {
140        name: ModuleId::new("std"),
141        doc: "mpl standard library",
142        submodules,
143        align_functions,
144        mapping_functions,
145        group_functions,
146        compute_functions,
147        bucket_functions,
148    }
149});