Some checks failed
Secrets CLI - Build & Release / 质量检查 (fmt / clippy / test) (push) Successful in 57s
Secrets CLI - Build & Release / Build (aarch64-apple-darwin) (push) Successful in 33s
Secrets CLI - Build & Release / 版本 & Release (push) Successful in 2s
Secrets CLI - Build & Release / Build (x86_64-unknown-linux-musl) (push) Successful in 44s
Secrets CLI - Build & Release / 发布草稿 Release (push) Successful in 2s
Secrets CLI - Build & Release / Build (x86_64-pc-windows-msvc) (push) Has been cancelled
- search: 新增 --name、-f/--field、-o/--output、--summary、--limit、--offset、--sort - search: 非 TTY 自动输出 json-compact,便于 AI 解析 - search: -f secret.* 自动解锁 secrets - add: 支持 -o json/json-compact 输出 - add: 重构为 AddArgs 结构体 - 全局: 各子命令 after_help 补充典型值示例 - output.rs: OutputMode 枚举 + TTY 检测 - 文档: README/AGENTS 面向 AI 的用法,连接串改为 <host>:<port> Made-with: Cursor
48 lines
1.3 KiB
Rust
48 lines
1.3 KiB
Rust
use std::io::IsTerminal;
|
|
use std::str::FromStr;
|
|
|
|
/// Output format for all commands.
|
|
#[derive(Debug, Clone, Default, PartialEq)]
|
|
pub enum OutputMode {
|
|
/// Human-readable text (default when stdout is a TTY)
|
|
#[default]
|
|
Text,
|
|
/// Pretty-printed JSON
|
|
Json,
|
|
/// Single-line JSON (default when stdout is NOT a TTY, e.g. piped to jq)
|
|
JsonCompact,
|
|
/// KEY=VALUE pairs suitable for `source` or `.env` files
|
|
Env,
|
|
}
|
|
|
|
impl FromStr for OutputMode {
|
|
type Err = anyhow::Error;
|
|
|
|
fn from_str(s: &str) -> Result<Self, Self::Err> {
|
|
match s {
|
|
"text" => Ok(Self::Text),
|
|
"json" => Ok(Self::Json),
|
|
"json-compact" => Ok(Self::JsonCompact),
|
|
"env" => Ok(Self::Env),
|
|
other => Err(anyhow::anyhow!(
|
|
"Unknown output format '{}'. Valid: text, json, json-compact, env",
|
|
other
|
|
)),
|
|
}
|
|
}
|
|
}
|
|
|
|
/// Resolve the effective output mode.
|
|
/// - Explicit value from `--output` takes priority.
|
|
/// - TTY → text; non-TTY (piped/redirected) → json-compact.
|
|
pub fn resolve_output_mode(explicit: Option<&str>) -> anyhow::Result<OutputMode> {
|
|
if let Some(s) = explicit {
|
|
return s.parse();
|
|
}
|
|
if std::io::stdout().is_terminal() {
|
|
Ok(OutputMode::Text)
|
|
} else {
|
|
Ok(OutputMode::JsonCompact)
|
|
}
|
|
}
|