Skip to main content

run_backend/
run_backend.rs

1//! Backend example: Rust injects people data, Josie shapes custom JSON response.
2//! Output format: { name, schemaVersion, properties: { totalCount, people: [...] } }
3//!
4//! Usage: cargo run -p josie-core --example run_backend
5
6use josie_core::program::{execute_program, parse_program};
7use josie_core::{read_program, Operators};
8use serde_json::json;
9use std::process;
10
11static BACKEND_SCRIPT: &str = include_str!("backend_shape.josie");
12
13fn main() {
14    let mut doc = read_program(BACKEND_SCRIPT).unwrap_or_else(|e| {
15        eprintln!("parse: {:?}", e);
16        process::exit(1);
17    });
18
19    // Inject people data (e.g. from DB or API)
20    let raw_people = json!([
21        {
22            "id": 1,
23            "first": "Jane",
24            "last": "Doe",
25            "age": 28,
26            "city": "London",
27            "country": "UK",
28            "email": "jane.doe@example.com",
29            "phone": "+44 20 7946 0958",
30            "tags": ["customer", "vip"]
31        },
32        {
33            "id": 2,
34            "first": "Bob",
35            "last": "Smith",
36            "age": 34,
37            "city": "Berlin",
38            "country": "DE",
39            "email": "bob.smith@example.com",
40            "phone": "+49 30 12345678",
41            "tags": ["partner"]
42        },
43        {
44            "id": 3,
45            "first": "Alice",
46            "last": "Wu",
47            "age": 41,
48            "city": "Singapore",
49            "country": "SG",
50            "email": "alice.wu@example.com",
51            "phone": null,
52            "tags": []
53        },
54    ]);
55    doc["state"]["server"] = json!({ "raw_people": raw_people });
56
57    let program = parse_program(&doc).unwrap_or_else(|e| {
58        eprintln!("validate: {} - {}", e.code, e.message);
59        process::exit(1);
60    });
61    let operators = Operators::new();
62    let out = execute_program(&program, &operators).unwrap_or_else(|e| {
63        eprintln!("run: {} - {}", e.code, e.message);
64        process::exit(1);
65    });
66
67    println!("server.response (custom JSON shape):");
68    println!("{}", serde_json::to_string_pretty(&out.state.server["response"]).unwrap());
69}