Skip to main content

control_state_structured_variables/
control_state_structured_variables.rs

1#[path = "support/utils.rs"]
2mod _utils;
3
4use _utils::{boxed_error, cleanup_run, create_client, new_run_id, print_summary, require};
5use mubit_sdk::TransportMode;
6use serde_json::{json, Value};
7use std::error::Error;
8use std::time::Instant;
9
10#[tokio::main(flavor = "current_thread")]
11async fn main() -> Result<(), Box<dyn Error>> {
12    let name = "control_state_structured_variables";
13    let started = Instant::now();
14    let client = create_client().await?;
15    let run_id = new_run_id("control_state_structured_variables");
16    client.set_run_id(Some(run_id.clone()));
17    client.set_transport(TransportMode::Http);
18
19    let mut passed = true;
20    let mut detail = "validated control structured variable state-management".to_string();
21    let mut metrics = json!({});
22
23    let scenario = async {
24        let variable_name = "planner_state";
25        let value_json = json!({ "phase": "draft", "confidence": 0.91_f32 }).to_string();
26
27        let set = client
28            .control
29            .set_variable(json!({
30                "run_id": run_id,
31                "name": variable_name,
32                "value_json": value_json,
33                "source": "explicit",
34            }))
35            .await?;
36        require(
37            set.get("success").and_then(Value::as_bool).unwrap_or(false),
38            format!("set_variable failed: {set}"),
39        )?;
40
41        let get = client
42            .control
43            .get_variable(json!({ "run_id": run_id, "name": variable_name }))
44            .await?;
45        let list = client
46            .control
47            .list_variables(json!({ "run_id": run_id }))
48            .await?;
49        let delete = client
50            .control
51            .delete_variable(json!({ "run_id": run_id, "name": variable_name }))
52            .await?;
53
54        require(get.is_object(), format!("get_variable failed: {get}"))?;
55        require(list.is_object(), format!("list_variables failed: {list}"))?;
56        require(
57            delete
58                .get("success")
59                .and_then(Value::as_bool)
60                .unwrap_or(false),
61            format!("delete_variable failed: {delete}"),
62        )?;
63
64        let variables = list
65            .get("variables")
66            .and_then(Value::as_array)
67            .ok_or_else(|| boxed_error(format!("list_variables payload invalid: {list}")))?;
68        require(
69            variables
70                .iter()
71                .any(|entry| entry.get("name").and_then(Value::as_str) == Some(variable_name)),
72            format!("variable not present in list_variables: {list}"),
73        )?;
74
75        metrics = json!({
76            "run_id": run_id,
77            "variable_name": variable_name,
78            "variable_count": variables.len(),
79        });
80        Ok::<(), Box<dyn Error>>(())
81    }
82    .await;
83
84    if let Err(err) = scenario {
85        passed = false;
86        detail = err.to_string();
87    }
88
89    let cleanup_ok = cleanup_run(&client, &run_id).await;
90    if !cleanup_ok {
91        passed = false;
92        detail = format!("{detail} | cleanup failures");
93    }
94
95    print_summary(
96        name,
97        passed,
98        &detail,
99        &metrics,
100        started.elapsed().as_secs_f64(),
101        cleanup_ok,
102    );
103
104    if passed {
105        Ok(())
106    } else {
107        Err(boxed_error(detail))
108    }
109}