1use std::{collections::HashMap, sync::LazyLock};
3
4use crate::{
5 linker::{FunctionId, Module, ModuleId},
6 types::{BucketType, ComputeType, ConversionMethod, MapType, TagsType, TimeType},
7};
8pub 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 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 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});