#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum OutputPolicy {
Passthrough,
Verbatim,
Compressible,
}
impl OutputPolicy {
pub fn is_protected(&self) -> bool {
matches!(self, Self::Passthrough | Self::Verbatim)
}
}
pub fn classify(command: &str, user_excluded: &[String]) -> OutputPolicy {
if is_passthrough(command, user_excluded) {
return OutputPolicy::Passthrough;
}
if super::compress::is_verbatim_output(command) {
return OutputPolicy::Verbatim;
}
OutputPolicy::Compressible
}
fn is_passthrough(command: &str, user_excluded: &[String]) -> bool {
super::compress::is_excluded_command(command, user_excluded)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn passthrough_beats_verbatim() {
assert_eq!(
classify("gh api repos/owner/repo/issues", &[]),
OutputPolicy::Passthrough
);
}
#[test]
fn user_excluded_is_passthrough() {
let excl = vec!["mycommand".to_string()];
assert_eq!(
classify("mycommand --flag", &excl),
OutputPolicy::Passthrough
);
}
#[test]
fn curl_is_verbatim() {
assert_eq!(
classify("curl https://api.example.com", &[]),
OutputPolicy::Verbatim
);
}
#[test]
fn cat_is_verbatim() {
assert_eq!(classify("cat package.json", &[]), OutputPolicy::Verbatim);
}
#[test]
fn cargo_build_is_compressible() {
assert_eq!(classify("cargo build", &[]), OutputPolicy::Compressible);
}
#[test]
fn npm_test_is_compressible() {
assert_eq!(classify("npm test", &[]), OutputPolicy::Compressible);
}
#[test]
fn dev_server_is_passthrough() {
assert_eq!(classify("npm run dev", &[]), OutputPolicy::Passthrough);
assert_eq!(classify("cargo watch", &[]), OutputPolicy::Passthrough);
assert_eq!(classify("cargo run", &[]), OutputPolicy::Passthrough);
}
#[test]
fn git_diff_is_verbatim() {
let policy = classify("git diff", &[]);
assert_eq!(policy, OutputPolicy::Compressible);
}
#[test]
fn auth_commands_are_passthrough() {
assert_eq!(classify("az login", &[]), OutputPolicy::Passthrough);
assert_eq!(
classify("gcloud auth login", &[]),
OutputPolicy::Passthrough
);
assert_eq!(classify("firebase login", &[]), OutputPolicy::Passthrough);
}
#[test]
fn jq_is_verbatim() {
assert_eq!(
classify("jq '.items' data.json", &[]),
OutputPolicy::Verbatim
);
}
#[test]
fn unknown_command_is_compressible() {
assert_eq!(
classify("some-random-tool --flag", &[]),
OutputPolicy::Compressible
);
}
#[test]
fn piped_jq_is_verbatim() {
assert_eq!(
classify("kubectl get pods -o json | jq '.items[]'", &[]),
OutputPolicy::Verbatim
);
}
#[test]
fn policy_is_protected() {
assert!(OutputPolicy::Passthrough.is_protected());
assert!(OutputPolicy::Verbatim.is_protected());
assert!(!OutputPolicy::Compressible.is_protected());
}
#[test]
fn issue_198_gh_api_jq() {
assert_eq!(
classify("gh api repos/yvgude/lean-ctx/issues/198 --jq '.body'", &[]),
OutputPolicy::Passthrough
);
}
#[test]
fn issue_159_cat_pubspec() {
assert_eq!(classify("cat pubspec.yaml", &[]), OutputPolicy::Verbatim);
}
#[test]
fn issue_114_git_stash() {
let p = classify("git stash show", &[]);
assert_eq!(p, OutputPolicy::Compressible);
}
#[test]
fn issue_194_git_diff_raw() {
let p = classify("git diff --cached", &[]);
assert_eq!(p, OutputPolicy::Compressible);
}
#[test]
fn npm_install_is_compressible() {
assert_eq!(
classify("npm install -g deepseek-tui", &[]),
OutputPolicy::Compressible
);
}
#[test]
fn pip_install_is_compressible() {
assert_eq!(
classify("pip install flask", &[]),
OutputPolicy::Compressible
);
}
#[test]
fn kubectl_get_yaml_is_verbatim() {
assert_eq!(
classify("kubectl get pods -o yaml", &[]),
OutputPolicy::Verbatim
);
}
#[test]
fn docker_inspect_is_verbatim() {
assert_eq!(
classify("docker inspect my-container", &[]),
OutputPolicy::Verbatim
);
}
#[test]
fn terraform_output_is_verbatim() {
assert_eq!(classify("terraform output", &[]), OutputPolicy::Verbatim);
}
#[test]
fn heroku_logs_is_verbatim() {
assert_eq!(classify("heroku logs --tail", &[]), OutputPolicy::Verbatim);
}
#[test]
fn gh_pr_list_is_passthrough() {
assert_eq!(classify("gh pr list", &[]), OutputPolicy::Passthrough);
}
#[test]
fn lean_ctx_is_passthrough() {
assert_eq!(
classify("lean-ctx init powershell", &[]),
OutputPolicy::Passthrough
);
assert_eq!(
classify("lean-ctx overview", &[]),
OutputPolicy::Passthrough
);
}
#[test]
fn stripe_list_is_verbatim() {
assert_eq!(classify("stripe charges list", &[]), OutputPolicy::Verbatim);
}
}