use pondrs::datasets::{CellDataset, Param};
use pondrs::error::PondError;
use pondrs::{Dataset, Node, Pipeline, SequentialRunner};
use pondrs::runners::Runner;
use serde::Serialize;
#[derive(Serialize)]
struct Catalog {
a: CellDataset<i32>,
b: CellDataset<i32>,
c: CellDataset<i32>,
}
#[derive(Serialize)]
struct Params {
scale: Param<i32>,
offset: Param<i32>,
}
fn checked_square(b: i32) -> Result<(i32,), PondError> {
if b == 0 {
return Err(PondError::DatasetNotLoaded); }
Ok((b * b,))
}
fn main() -> Result<(), PondError> {
let params = Params {
scale: Param(3),
offset: Param(10),
};
let catalog = Catalog {
a: CellDataset::new(),
b: CellDataset::new(),
c: CellDataset::new(),
};
let pipe = (
Node {
name: "multiply",
func: |v| (v * 2,),
input: (¶ms.scale,),
output: (&catalog.a,),
},
Pipeline {
name: "transform",
steps: (
Node {
name: "add_offset",
func: |a, off| (a + off,),
input: (&catalog.a, ¶ms.offset),
output: (&catalog.b,),
},
Node {
name: "square",
func: checked_square,
input: (&catalog.b,),
output: (&catalog.c,),
},
),
input: (&catalog.a, ¶ms.offset),
output: (&catalog.c,),
},
);
let hooks = ();
SequentialRunner.run::<PondError>(&pipe, &catalog, ¶ms, &hooks)?;
let result = catalog.c.load()?;
assert_eq!(result, 256);
println!("Pipeline result: {result}");
println!("no_std-compatible pipeline executed successfully!");
Ok(())
}