control_state_structured_variables/
control_state_structured_variables.rs1#[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}