refactor: name the modules after what they hold

This commit is contained in:
2026-09-08 12:10:41 +00:00
parent a3c08f6eaa
commit bb0a2cca44
12 changed files with 1014 additions and 989 deletions

View File

@@ -0,0 +1,46 @@
use std::io::{self, Write};
use anyhow::{Context, Result};
use clap::CommandFactory;
use clap_complete::{Shell, generate};
use crate::cli::Ahab;
pub fn completions(shell: Shell) -> Result<()> {
let script = script(shell);
let mut stdout = io::stdout().lock();
match stdout.write_all(&script).and_then(|()| stdout.flush()) {
Err(e) if e.kind() == io::ErrorKind::BrokenPipe => Ok(()),
result => result.context("writing the completion script"),
}
}
fn script(shell: Shell) -> Vec<u8> {
let mut cmd = Ahab::command();
let name = cmd.get_name().to_string();
let mut script = Vec::new();
generate(shell, &mut cmd, name, &mut script);
script
}
#[cfg(test)]
mod tests {
use super::{Shell, script};
use clap::ValueEnum;
#[test]
fn every_shell_gets_a_script_covering_the_subcommands() {
for shell in Shell::value_variants() {
let out = String::from_utf8(script(*shell)).expect("script is utf8");
for subcommand in ["django", "postgres", "link", "completions"] {
assert!(
out.contains(subcommand),
"{shell:?} script never mentions {subcommand}"
);
}
}
}
}