aboutsummaryrefslogtreecommitdiff
path: root/src/cli/workspace.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/cli/workspace.rs')
-rw-r--r--src/cli/workspace.rs91
1 files changed, 90 insertions, 1 deletions
diff --git a/src/cli/workspace.rs b/src/cli/workspace.rs
index e59a3663..525fc971 100644
--- a/src/cli/workspace.rs
+++ b/src/cli/workspace.rs
@@ -1,6 +1,8 @@
use std::collections::HashMap;
-use crate::api::schema::{WorkspaceCreateParams, WorkspaceRenameParams};
+use crate::api::schema::{
+ Method, WorkspaceCreateParams, WorkspaceRenameParams, WorkspaceReportMetadataParams,
+};
pub(super) fn run_workspace_command(args: &[String]) -> std::io::Result<i32> {
let Some(subcommand) = args.first().map(|arg| arg.as_str()) else {
@@ -14,6 +16,7 @@ pub(super) fn run_workspace_command(args: &[String]) -> std::io::Result<i32> {
"get" => workspace_get(&args[1..]),
"focus" => workspace_focus(&args[1..]),
"rename" => workspace_rename(&args[1..]),
+ "report-metadata" => workspace_report_metadata(&args[1..]),
"close" => workspace_close(&args[1..]),
"help" | "--help" | "-h" => {
print_workspace_help();
@@ -136,6 +139,91 @@ fn workspace_rename(args: &[String]) -> std::io::Result<i32> {
})
}
+fn workspace_report_metadata(args: &[String]) -> std::io::Result<i32> {
+ let Some(raw_workspace_id) = args.first() else {
+ eprintln!("usage: herdr workspace report-metadata <workspace_id> --source ID [--token NAME=VALUE] [--clear-token NAME] [--seq N] [--ttl-ms N]");
+ return Ok(2);
+ };
+ let workspace_id = super::normalize_workspace_id(raw_workspace_id);
+ let mut source = None;
+ let mut tokens = HashMap::new();
+ let mut seq = None;
+ let mut ttl_ms = None;
+ let mut index = 1;
+ while index < args.len() {
+ match args[index].as_str() {
+ "--source" => {
+ let Some(value) = args.get(index + 1) else {
+ eprintln!("missing value for --source");
+ return Ok(2);
+ };
+ source = Some(value.clone());
+ index += 2;
+ }
+ "--token" => {
+ let Some(value) = args.get(index + 1) else {
+ eprintln!("missing value for --token");
+ return Ok(2);
+ };
+ let (key, value) = match super::parse_token_assignment(value) {
+ Ok(token) => token,
+ Err(message) => {
+ eprintln!("{message}");
+ return Ok(2);
+ }
+ };
+ tokens.insert(key, value);
+ index += 2;
+ }
+ "--clear-token" => {
+ let Some(key) = args.get(index + 1) else {
+ eprintln!("missing value for --clear-token");
+ return Ok(2);
+ };
+ tokens.insert(key.clone(), None);
+ index += 2;
+ }
+ "--seq" => {
+ let Some(value) = args.get(index + 1) else {
+ eprintln!("missing value for --seq");
+ return Ok(2);
+ };
+ seq = Some(super::parse_u64_flag("--seq", value)?);
+ index += 2;
+ }
+ "--ttl-ms" => {
+ let Some(value) = args.get(index + 1) else {
+ eprintln!("missing value for --ttl-ms");
+ return Ok(2);
+ };
+ ttl_ms = Some(super::parse_u64_flag("--ttl-ms", value)?);
+ index += 2;
+ }
+ other => {
+ eprintln!("unknown option: {other}");
+ return Ok(2);
+ }
+ }
+ }
+ let Some(source) = source.filter(|source| !source.trim().is_empty()) else {
+ eprintln!("missing required --source");
+ return Ok(2);
+ };
+ if tokens.is_empty() {
+ eprintln!("missing token to set or clear");
+ return Ok(2);
+ }
+ super::send_ok_request(Method::WorkspaceReportMetadata(
+ WorkspaceReportMetadataParams {
+ workspace_id,
+ source,
+ tokens,
+ seq,
+ ttl_ms,
+ },
+ ))
+}
+
fn workspace_close(args: &[String]) -> std::io::Result<i32> {
let Some(raw_workspace_id) = args.first() else {
eprintln!("usage: herdr workspace close <workspace_id>");
@@ -156,5 +244,6 @@ fn print_workspace_help() {
eprintln!(" herdr workspace get <workspace_id>");
eprintln!(" herdr workspace focus <workspace_id>");
eprintln!(" herdr workspace rename <workspace_id> <label>");
+ eprintln!(" herdr workspace report-metadata <workspace_id> --source ID [--token NAME=VALUE] [--clear-token NAME] [--seq N] [--ttl-ms N]");
eprintln!(" herdr workspace close <workspace_id>");
}