use std::collections::BTreeMap;
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use ts_rs::TS;
#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize, JsonSchema, TS)]
#[serde(deny_unknown_fields)]
pub struct ToolCliSpec {
#[schemars(length(min = 1), inner(pattern(r"^[A-Za-z0-9_][A-Za-z0-9_-]*$")))]
pub command: Vec<String>,
#[serde(default)]
#[schemars(inner(pattern(r"^[A-Za-z0-9_][A-Za-z0-9_-]*$")), extend("uniqueItems" = true))]
pub aliases: Vec<String>,
pub hidden: bool,
#[serde(default)]
pub arguments: BTreeMap<String, ToolCliArgumentSpec>,
}
#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize, JsonSchema, TS)]
#[serde(deny_unknown_fields)]
pub struct ToolCliTreeSpec {
#[serde(default)]
pub commands: Vec<ToolCliCommandSpec>,
}
#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize, JsonSchema, TS)]
#[serde(deny_unknown_fields)]
pub struct ToolCliCommandSpec {
#[schemars(length(min = 1), inner(pattern(r"^[A-Za-z0-9_][A-Za-z0-9_-]*$")))]
pub command: Vec<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[ts(optional = nullable)]
#[schemars(length(min = 1), pattern(r".*\S.*"))]
pub title: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[ts(optional = nullable)]
#[schemars(length(min = 1), pattern(r".*\S.*"))]
pub description: Option<String>,
#[serde(default)]
#[schemars(inner(pattern(r"^[A-Za-z0-9_][A-Za-z0-9_-]*$")), extend("uniqueItems" = true))]
pub aliases: Vec<String>,
#[serde(default)]
pub hidden: bool,
#[serde(skip_serializing_if = "Option::is_none")]
#[ts(optional = nullable)]
pub display_order: Option<u32>,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq, Serialize, Deserialize, JsonSchema, TS)]
#[serde(rename_all = "snake_case")]
pub enum ToolCliValueHint {
File,
Directory,
Path,
Url,
Email,
Username,
Hostname,
Command,
Other,
}
#[derive(Clone, Copy, Debug, Default, Eq, PartialEq, Serialize, Deserialize, JsonSchema, TS)]
#[serde(rename_all = "snake_case")]
pub enum ToolCliBooleanStyle {
#[default]
Value,
SetTrue,
SetFalse,
}
#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize, JsonSchema, TS)]
#[serde(deny_unknown_fields)]
pub struct ToolCliArgumentSpec {
#[serde(skip_serializing_if = "Option::is_none")]
#[ts(optional = nullable)]
#[schemars(pattern(r"^[A-Za-z0-9][A-Za-z0-9-]*$"))]
pub long: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[ts(optional = nullable)]
pub short: Option<char>,
#[serde(default)]
#[schemars(inner(pattern(r"^[A-Za-z0-9][A-Za-z0-9-]*$")), extend("uniqueItems" = true))]
pub aliases: Vec<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[ts(optional = nullable)]
pub position: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
#[ts(optional = nullable)]
#[schemars(length(min = 1), pattern(r".*\S.*"))]
pub value_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[ts(optional = nullable)]
#[schemars(length(min = 1), pattern(r".*\S.*"))]
pub help: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[ts(optional = nullable)]
pub value_hint: Option<ToolCliValueHint>,
#[serde(default)]
pub boolean_style: ToolCliBooleanStyle,
#[serde(default)]
pub repeatable: bool,
#[serde(default)]
pub hidden: bool,
#[serde(default)]
#[schemars(extend("uniqueItems" = true))]
pub completions: Vec<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[ts(optional = nullable)]
pub display_order: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
#[ts(optional = nullable)]
#[schemars(length(min = 1), pattern(r".*\S.*"))]
pub help_group: Option<String>,
}