pub mod approval;
pub mod builtin_group;
pub mod cli;
pub mod config;
pub mod discovery;
pub mod display_helpers;
pub mod exposure;
pub mod fs_discoverer;
pub mod init_cmd;
pub mod output;
pub mod ref_resolver;
pub mod schema_parser;
pub mod security;
pub mod shell;
pub mod strategy;
pub mod system_cmd;
pub mod validate;
#[doc(hidden)]
pub mod sandbox_runner;
pub const EXIT_SUCCESS: i32 = 0;
pub const EXIT_MODULE_EXECUTE_ERROR: i32 = 1;
pub const EXIT_INVALID_INPUT: i32 = 2;
pub const EXIT_MODULE_NOT_FOUND: i32 = 44;
pub const EXIT_SCHEMA_VALIDATION_ERROR: i32 = 45;
pub const EXIT_APPROVAL_DENIED: i32 = 46;
pub const EXIT_CONFIG_NOT_FOUND: i32 = 47;
pub const EXIT_SCHEMA_CIRCULAR_REF: i32 = 48;
pub const EXIT_ACL_DENIED: i32 = 77;
pub const EXIT_CONFIG_NAMESPACE_RESERVED: i32 = 78;
pub const EXIT_CONFIG_MOUNT_ERROR: i32 = 66;
pub const EXIT_CONFIG_BIND_ERROR: i32 = 65;
pub const EXIT_ERROR_FORMATTER_DUPLICATE: i32 = 70;
pub const EXIT_SIGINT: i32 = 130;
pub const APCLI_ALWAYS_REGISTERED: &[&str] = &["exec"];
pub fn register_apcli_subcommands(
apcli_group: clap::Command,
cfg: &ApcliGroup,
prog_name: &str,
) -> clap::Command {
type Registrar = Box<dyn FnOnce(clap::Command) -> clap::Command>;
let prog_name_for_completion = prog_name.to_string();
let table: Vec<(&'static str, Registrar)> = vec![
("list", Box::new(discovery::register_list_command)),
("describe", Box::new(discovery::register_describe_command)),
("exec", Box::new(discovery::register_exec_command)),
("validate", Box::new(validate::register_validate_command)),
("init", Box::new(init_cmd::register_init_command)),
("health", Box::new(system_cmd::register_health_command)),
("usage", Box::new(system_cmd::register_usage_command)),
("enable", Box::new(system_cmd::register_enable_command)),
("disable", Box::new(system_cmd::register_disable_command)),
("reload", Box::new(system_cmd::register_reload_command)),
("config", Box::new(system_cmd::register_config_command)),
(
"completion",
Box::new(move |cli| shell::register_completion_command(cli, &prog_name_for_completion)),
),
(
"describe-pipeline",
Box::new(strategy::register_pipeline_command),
),
];
let mode = cfg.resolve_visibility();
let mut cmd = apcli_group;
for (name, registrar) in table {
let should_register = match mode {
"all" | "none" => true,
_ => APCLI_ALWAYS_REGISTERED.contains(&name) || cfg.is_subcommand_included(name),
};
if should_register {
cmd = registrar(cmd);
}
}
cmd
}
pub use approval::{
check_approval, ApprovalDeniedError, ApprovalError, ApprovalResult, ApprovalStatus,
ApprovalTimeoutError, CliApprovalHandler,
};
pub use builtin_group::{ApcliConfig, ApcliGroup, ApcliMode};
pub use cli::{
build_module_command, build_module_command_with_limit, collect_input,
collect_input_from_reader, dispatch_module, get_docs_url, is_verbose_help, set_audit_logger,
set_docs_url, set_executables, set_verbose_help, validate_module_id,
};
pub use builtin_group::{APCLI_SUBCOMMAND_NAMES, RESERVED_GROUP_NAMES};
pub use config::ConfigResolver;
pub use discovery::{
cmd_describe, cmd_list, cmd_list_enhanced, register_discovery_commands, ApCoreRegistryProvider,
DiscoveryError, ListOptions, RegistryProvider,
};
#[cfg(any(test, feature = "test-support"))]
#[doc(hidden)]
pub use discovery::{mock_module, MockRegistry};
pub use display_helpers::{get_cli_display_fields, get_display};
pub use exposure::ExposureFilter;
pub use fs_discoverer::FsDiscoverer;
pub use init_cmd::{handle_init, init_command};
pub use output::{format_exec_result, format_module_detail, format_module_list, resolve_format};
pub use ref_resolver::resolve_refs;
pub use schema_parser::{
extract_help_with_limit, reconvert_enum_values, schema_to_clap_args,
schema_to_clap_args_with_limit, BoolFlagPair, SchemaArgs, SchemaParserError, HELP_TEXT_MAX_LEN,
RESERVED_PROPERTY_NAMES,
};
pub use security::{
AuditLogger, AuthProvider, AuthenticationError, ConfigDecryptionError, ConfigEncryptor,
ModuleExecutionError, ModuleNotFoundError, Sandbox, SchemaValidationError,
};
pub use shell::{
build_program_man_page, cmd_completion, cmd_man, completion_command, has_man_flag, ShellError,
};
pub use system_cmd::SYSTEM_COMMANDS;
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn registrar_table_covers_all_apcli_subcommand_names() {
let cfg = builtin_group::ApcliGroup::from_yaml(None, false);
let root = clap::Command::new("root").about("drift-guard root");
let built = register_apcli_subcommands(root, &cfg, "apcore-cli");
let registered: Vec<&str> = built.get_subcommands().map(|s| s.get_name()).collect();
for name in APCLI_SUBCOMMAND_NAMES {
assert!(
registered.contains(name),
"APCLI_SUBCOMMAND_NAMES lists '{name}' but register_apcli_subcommands \
did not attach it — drift between builtin_group.rs constant and the \
Registrar table in lib.rs"
);
}
}
}