quickwit-oss/quickwit · error

unknown tool subcommand

Error message

unknown tool subcommand `{subcommand}`

What it means

The `quickwit tool` subcommand parser received a sub-subcommand that matches none of the registered tool operations (gc, local-ingest, local-search, extract-split, merge). The extracted subcommand name fell through the match arms to the error branch.

Solutions

  1. Run `quickwit tool --help` to list valid tool subcommands
  2. Check for typos or outdated subcommand names from older Quickwit versions
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at quickwit/quickwit-cli/src/tool.rs:240 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of quickwit-oss/quickwit@a39730c5cd (2026-09-08). Data as JSON: /api/errors/8d90250218b445df. Report an issue: GitHub.

Appendix: source

Thrown at quickwit/quickwit-cli/src/tool.rs:240

    GarbageCollect(GarbageCollectIndexArgs),
    LocalIngest(LocalIngestDocsArgs),
    LocalSearch(LocalSearchArgs),
    ExtractSplit(ExtractSplitArgs),
    Merge(MergeArgs),
}

impl ToolCliCommand {
    pub fn parse_cli_args(mut matches: ArgMatches) -> anyhow::Result<Self> {
        let (subcommand, submatches) = matches
            .remove_subcommand()
            .context("failed to parse tool subcommand")?;
        match subcommand.as_str() {
            "gc" => Self::parse_garbage_collect_args(submatches),
            "local-ingest" => Self::parse_local_ingest_args(submatches),
            "local-search" => Self::parse_local_search_args(submatches),
            "merge" => Self::parse_merge_args(submatches),
            "extract-split" => Self::parse_extract_split_args(submatches),
            _ => bail!("unknown tool subcommand `{subcommand}`"),
        }
    }

    fn parse_local_ingest_args(mut matches: ArgMatches) -> anyhow::Result<Self> {
        let config_uri = matches
            .remove_one::<String>("config")
            .map(|uri_str| Uri::from_str(&uri_str))
            .expect("`config` should be a required arg.")?;
        let index_id = matches
            .remove_one::<String>("index")
            .expect("`index` should be a required arg.");
        let input_path_opt = if let Some(input_path) = matches.remove_one::<String>("input-path") {
            Some(Uri::from_str(&input_path)?)
        } else {
            None
        };

        let input_format = matches

View on GitHub (pinned to a39730c5cd)