Add pile doc
Some checks failed
CI / Typos (push) Successful in 21s
CI / Clippy (push) Failing after 1m33s
CI / Build and test (push) Failing after 2m40s

This commit is contained in:
2026-03-10 12:10:31 -07:00
parent 54981e60cb
commit 5445872ad1

View File

@@ -1,6 +1,8 @@
use anyhow::Result; use anyhow::Result;
use clap::Subcommand; use clap::{CommandFactory, Subcommand};
use pile_toolbox::cancelabletask::{CancelFlag, CancelableTask, CancelableTaskError}; use pile_toolbox::cancelabletask::{
CancelFlag, CancelableTask, CancelableTaskError, CancelableTaskResult,
};
mod annotate; mod annotate;
mod check; mod check;
@@ -9,10 +11,14 @@ mod init;
mod lookup; mod lookup;
mod probe; mod probe;
use crate::GlobalContext; use crate::{Cli, GlobalContext};
#[derive(Debug, Subcommand)] #[derive(Debug, Subcommand)]
pub enum SubCommand { pub enum SubCommand {
/// Print help for all subcommands
#[clap(alias = "doc")]
Docs {},
/// Annotate all items with a field, writing it to a sidecar path /// Annotate all items with a field, writing it to a sidecar path
Annotate { Annotate {
#[command(flatten)] #[command(flatten)]
@@ -59,6 +65,13 @@ impl CliCmdDispatch for SubCommand {
Self::Index { cmd } => cmd.start(ctx), Self::Index { cmd } => cmd.start(ctx),
Self::Lookup { cmd } => cmd.start(ctx), Self::Lookup { cmd } => cmd.start(ctx),
Self::Probe { cmd } => cmd.start(ctx), Self::Probe { cmd } => cmd.start(ctx),
Self::Docs {} => {
print_help_recursively(&mut Cli::command(), None);
return Ok(CancelableTask::spawn(|_| async {
CancelableTaskResult::Finished(Ok(0))
}));
}
} }
} }
} }
@@ -80,3 +93,26 @@ pub(super) trait CliCmd: Sized + Send + 'static {
flag: CancelFlag, flag: CancelFlag,
) -> impl std::future::Future<Output = Result<i32, CancelableTaskError<anyhow::Error>>> + Send; ) -> impl std::future::Future<Output = Result<i32, CancelableTaskError<anyhow::Error>>> + Send;
} }
#[expect(clippy::print_stdout)]
fn print_help_recursively(command: &mut clap::Command, parent: Option<&str>) {
if command.get_name() == "help" || command.get_name() == "docs" {
return;
}
let parent = match parent {
None => command.get_name().into(),
Some(parent) => format!("{parent} {}", command.get_name()),
};
let b = "=".repeat(parent.len());
println!("============{b}===");
println!("# Docs for `{parent}` #");
println!("============{b}===");
println!("{}", command.render_help());
for subcommand in command.get_subcommands_mut() {
println!();
print_help_recursively(subcommand, Some(&parent));
}
}