ergo_runtime/compute/implementations/window/
impl.rs1use std::collections::HashMap;
2
3use crate::common::Value;
4use crate::compute::{ComputeError, ComputePrimitive, ComputePrimitiveManifest, PrimitiveState};
5
6use super::manifest::window_manifest;
7
8pub struct Window {
9 manifest: ComputePrimitiveManifest,
10}
11
12impl Window {
13 pub fn new() -> Self {
14 Self {
15 manifest: window_manifest(),
16 }
17 }
18}
19
20impl Default for Window {
21 fn default() -> Self {
22 Self::new()
23 }
24}
25
26impl ComputePrimitive for Window {
27 fn manifest(&self) -> &ComputePrimitiveManifest {
28 &self.manifest
29 }
30
31 fn compute(
32 &self,
33 inputs: &HashMap<String, Value>,
34 parameters: &HashMap<String, Value>,
35 _state: Option<&mut PrimitiveState>,
36 ) -> Result<HashMap<String, Value>, ComputeError> {
37 let series = inputs
38 .get("series")
39 .and_then(|v| v.as_series())
40 .expect("missing required series input 'series'");
41 let size = parameters
42 .get("size")
43 .and_then(|v| v.as_number())
44 .expect("missing required parameter 'size'");
45
46 if !size.is_finite() || size.fract() != 0.0 || size <= 0.0 {
47 return Err(ComputeError::InvalidParameter {
48 parameter: "size".to_string(),
49 reason: "size must be a positive integer".to_string(),
50 });
51 }
52
53 let size = size as usize;
54 let start = series.len().saturating_sub(size);
55 let result = series[start..].to_vec();
56
57 Ok(HashMap::from([(
58 "result".to_string(),
59 Value::Series(result),
60 )]))
61 }
62}