133 lines
3.9 KiB
Rust
133 lines
3.9 KiB
Rust
use anyhow::Result;
|
|
use crate::api::ApiClient;
|
|
use crate::output::{self, OutputFormat};
|
|
use crate::ui;
|
|
|
|
pub fn list(
|
|
client: &ApiClient,
|
|
agent_id: &str,
|
|
verbose: bool,
|
|
output_format: OutputFormat,
|
|
) -> Result<()> {
|
|
let spinner = if output_format == OutputFormat::Pretty {
|
|
Some(ui::create_spinner("Fetching operations..."))
|
|
} else {
|
|
None
|
|
};
|
|
|
|
let response = client.list_operations(agent_id, verbose);
|
|
|
|
if let Some(mut sp) = spinner {
|
|
sp.finish();
|
|
}
|
|
|
|
match response {
|
|
Ok(ops_response) => {
|
|
if output_format == OutputFormat::Pretty {
|
|
if ops_response.operations.is_empty() {
|
|
ui::print_info("No operations found");
|
|
} else {
|
|
ui::print_info(&format!("Found {} operation(s)", ops_response.operations.len()));
|
|
for op in &ops_response.operations {
|
|
println!("\n Operation ID: {}", op.id);
|
|
println!(" Type: {}", op.task_type);
|
|
println!(" Status: {}", op.status);
|
|
println!(" Items: {}", op.items_count);
|
|
if let Some(doc_id) = &op.document_id {
|
|
println!(" Document ID: {}", doc_id);
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
output::print_output(&ops_response, output_format)?;
|
|
}
|
|
Ok(())
|
|
}
|
|
Err(e) => Err(e)
|
|
}
|
|
}
|
|
|
|
/// Get the status of a specific operation
|
|
pub fn get(
|
|
client: &ApiClient,
|
|
agent_id: &str,
|
|
operation_id: &str,
|
|
verbose: bool,
|
|
output_format: OutputFormat,
|
|
) -> Result<()> {
|
|
let spinner = if output_format == OutputFormat::Pretty {
|
|
Some(ui::create_spinner("Fetching operation status..."))
|
|
} else {
|
|
None
|
|
};
|
|
|
|
let response = client.get_operation(agent_id, operation_id, verbose);
|
|
|
|
if let Some(mut sp) = spinner {
|
|
sp.finish();
|
|
}
|
|
|
|
match response {
|
|
Ok(result) => {
|
|
if output_format == OutputFormat::Pretty {
|
|
ui::print_section_header(&format!("Operation: {}", operation_id));
|
|
|
|
use hindsight_client::types::Status;
|
|
let status_str = match &result.status {
|
|
Status::Completed => ui::gradient_start("completed"),
|
|
Status::Pending => ui::gradient_mid("pending"),
|
|
Status::Failed => ui::gradient_end("failed"),
|
|
Status::NotFound => ui::gradient_end("not_found"),
|
|
};
|
|
|
|
println!(" {} {}", ui::dim("Status:"), status_str);
|
|
|
|
if let Some(error) = &result.error_message {
|
|
println!(" {} {}", ui::dim("Error:"), ui::gradient_end(error));
|
|
}
|
|
|
|
println!();
|
|
} else {
|
|
output::print_output(&result, output_format)?;
|
|
}
|
|
Ok(())
|
|
}
|
|
Err(e) => Err(e),
|
|
}
|
|
}
|
|
|
|
pub fn cancel(
|
|
client: &ApiClient,
|
|
agent_id: &str,
|
|
operation_id: &str,
|
|
verbose: bool,
|
|
output_format: OutputFormat,
|
|
) -> Result<()> {
|
|
let spinner = if output_format == OutputFormat::Pretty {
|
|
Some(ui::create_spinner("Cancelling operation..."))
|
|
} else {
|
|
None
|
|
};
|
|
|
|
let response = client.cancel_operation(agent_id, operation_id, verbose);
|
|
|
|
if let Some(mut sp) = spinner {
|
|
sp.finish();
|
|
}
|
|
|
|
match response {
|
|
Ok(result) => {
|
|
if output_format == OutputFormat::Pretty {
|
|
if result.success {
|
|
ui::print_success("Operation cancelled successfully");
|
|
} else {
|
|
ui::print_error("Failed to cancel operation");
|
|
}
|
|
} else {
|
|
output::print_output(&result, output_format)?;
|
|
}
|
|
Ok(())
|
|
}
|
|
Err(e) => Err(e)
|
|
}
|
|
}
|