bzzz-cli 0.1.0

Bzzz CLI - Command line interface for Agent orchestration
//! Output format types for structured CLI output

use serde::Serialize;

/// Output format for CLI commands
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, clap::ValueEnum)]
pub enum OutputFormat {
    /// Human-readable text (default)
    #[default]
    Text,
    /// Single-line JSON for machine parsing
    Json,
}

/// JSON output for `bzzz run`
#[derive(Debug, Serialize)]
pub struct RunOutput {
    pub run_id: String,
    pub status: String,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub output: Option<serde_json::Value>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub error: Option<String>,
    pub duration_ms: u64,
    pub artifacts_count: usize,
}

/// JSON output for `bzzz list` (runs mode)
#[derive(Debug, Serialize)]
pub struct ListRunsOutput {
    pub runs: Vec<ListRunEntry>,
}

/// A single run entry in the list output
#[derive(Debug, Serialize)]
pub struct ListRunEntry {
    pub run_id: String,
    pub status: String,
    pub spec_path: String,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub pid: Option<u32>,
}

/// JSON output for `bzzz list --agents`
#[derive(Debug, Serialize)]
pub struct ListWorkersOutput {
    pub workers: Vec<WorkerEntry>,
}

/// A single worker entry
#[derive(Debug, Serialize)]
pub struct WorkerEntry {
    pub name: String,
    pub worker_type: String,
    pub runtime: String,
}

/// JSON output for `bzzz list --patterns`
#[derive(Debug, Serialize)]
pub struct ListPatternsOutput {
    pub patterns: Vec<PatternEntry>,
}

/// A single pattern entry
#[derive(Debug, Serialize)]
pub struct PatternEntry {
    pub name: String,
    pub description: String,
}

/// JSON output for `bzzz list --templates`
#[derive(Debug, Serialize)]
pub struct ListTemplatesOutput {
    pub templates: Vec<String>,
}

/// JSON output for `bzzz list --agents --url` (Agent Card discovery)
#[derive(Debug, Serialize)]
pub struct AgentCardOutput {
    pub name: String,
    pub url: String,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub description: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub capabilities: Option<Vec<String>>,
}