vta_cli_common/commands/
device.rs1use serde_json::{Value, json};
9use vta_sdk::client::VtaClient;
10
11use crate::render::{DIM, RESET, is_json_output, print_json};
12
13fn print_result(label: &str, value: &Value) -> Result<(), Box<dyn std::error::Error>> {
16 if is_json_output() {
17 print_json(value)?;
18 } else {
19 println!("{label}");
20 println!("{}", serde_json::to_string_pretty(value)?);
21 }
22 Ok(())
23}
24
25pub async fn cmd_device_list(
28 client: &VtaClient,
29 service_kind: Option<String>,
30) -> Result<(), Box<dyn std::error::Error>> {
31 let mut filters = json!({});
32 if let Some(sk) = service_kind {
33 filters["consumerKindFilter"] = json!("service");
34 filters["serviceKindFilter"] = json!(sk);
35 }
36 let result = client.device_list(filters).await?;
37 print_result("Registered devices:", &result)
38}
39
40pub async fn cmd_device_register(
43 client: &VtaClient,
44 service_kind: String,
45 display_name: String,
46 platform: Option<String>,
47 hpke_public_key: Option<String>,
48) -> Result<(), Box<dyn std::error::Error>> {
49 let consumer_kind = json!({ "kind": "service", "serviceKind": service_kind });
50 let result = client
51 .device_register(
52 consumer_kind,
53 &display_name,
54 platform.as_deref(),
55 hpke_public_key.as_deref(),
56 )
57 .await?;
58 println!("{DIM}Device registered.{RESET}");
59 print_result("Binding:", &result)
60}
61
62pub async fn cmd_device_disable(
65 client: &VtaClient,
66 device_id: String,
67) -> Result<(), Box<dyn std::error::Error>> {
68 let result = client.device_disable(&device_id).await?;
69 println!("{DIM}Device {device_id} disabled.{RESET}");
70 print_result("Result:", &result)
71}
72
73pub async fn cmd_device_wipe(
77 client: &VtaClient,
78 device_id: String,
79 reason: String,
80 scope: String,
81) -> Result<(), Box<dyn std::error::Error>> {
82 let result = client.device_wipe(&device_id, &reason, &scope).await?;
83 println!("{DIM}Device {device_id} wiped (scope: {scope}).{RESET}");
84 print_result("Result:", &result)
85}
86
87pub async fn cmd_device_set_wake(
90 client: &VtaClient,
91 gateway: String,
92 handle: String,
93 suggested_triggers: Vec<String>,
94) -> Result<(), Box<dyn std::error::Error>> {
95 let result = client
96 .device_set_wake(&gateway, &handle, suggested_triggers)
97 .await?;
98 print_result("Wake handle recorded:", &result)
99}
100
101pub async fn cmd_device_heartbeat(
104 client: &VtaClient,
105 platform: Option<String>,
106) -> Result<(), Box<dyn std::error::Error>> {
107 let result = client.device_heartbeat(platform.as_deref()).await?;
108 print_result("Heartbeat:", &result)
109}