Skip to main content

run_data_eng/
run_data_eng.rs

1//! Data engineering example: Rust injects rows into server.raw_data,
2//! Josie wrangles (group_by region, aggregate, sort) and writes server.result.
3//!
4//! Usage: cargo run -p josie-core --example run_data_eng
5
6use josie_core::program::{execute_program, parse_program};
7use josie_core::{read_program, Operators};
8use serde_json::json;
9use std::process;
10
11static WRANGLE_SCRIPT: &str = include_str!("wrangle.josie");
12
13fn main() {
14    let mut doc = read_program(WRANGLE_SCRIPT).unwrap_or_else(|e| {
15        eprintln!("parse: {:?}", e);
16        process::exit(1);
17    });
18
19    // Inject data from Rust (e.g. from DB, file, API)
20    let raw_data = json!([
21        { "region": "APAC", "amount": 100, "product": "A" },
22        { "region": "EMEA", "amount": 50, "product": "B" },
23        { "region": "APAC", "amount": 80, "product": "A" },
24        { "region": "Americas", "amount": 120, "product": "C" },
25        { "region": "EMEA", "amount": 30, "product": "B" },
26        { "region": "APAC", "amount": 60, "product": "C" },
27    ]);
28    doc["state"]["server"] = json!({ "raw_data": raw_data });
29
30    let program = parse_program(&doc).unwrap_or_else(|e| {
31        eprintln!("validate: {} - {}", e.code, e.message);
32        process::exit(1);
33    });
34    let operators = Operators::new();
35    let out = execute_program(&program, &operators).unwrap_or_else(|e| {
36        eprintln!("run: {} - {}", e.code, e.message);
37        process::exit(1);
38    });
39
40    println!("server.result (by region: count, total amount, desc):");
41    println!("{}", serde_json::to_string_pretty(&out.state.server["result"]).unwrap());
42}