help-probe 0.1.0

CLI tool discovery and automation framework that extracts structured information from command help text
Documentation
use help_probe::api_docs::{DocFormat, generate_api_docs};
use help_probe::model::ProbeResult;

fn create_test_result() -> ProbeResult {
    ProbeResult {
        command: "test-cmd".to_string(),
        args: vec![],
        exit_code: Some(0),
        timed_out: false,
        help_flag_detected: true,
        usage_blocks: vec!["test-cmd [OPTIONS] <FILE>".to_string()],
        options: vec![],
        subcommands: vec![],
        arguments: vec![],
        examples: vec![],
        environment_variables: vec![],
        validation_rules: vec![],
        raw_stdout: "Test command description".to_string(),
        raw_stderr: String::new(),
    }
}

#[test]
fn generate_api_docs_markdown() {
    let result = create_test_result();
    let docs = generate_api_docs(&result, DocFormat::Markdown);

    assert!(docs.contains("# test-cmd"));
    assert!(docs.contains("## Description"));
    assert!(docs.contains("## Usage"));
}

#[test]
fn generate_api_docs_html() {
    let result = ProbeResult {
        command: "test-cmd".to_string(),
        args: vec![],
        exit_code: Some(0),
        timed_out: false,
        help_flag_detected: true,
        usage_blocks: vec![],
        options: vec![],
        subcommands: vec![],
        arguments: vec![],
        examples: vec![],
        environment_variables: vec![],
        validation_rules: vec![],
        raw_stdout: String::new(),
        raw_stderr: String::new(),
    };

    let docs = generate_api_docs(&result, DocFormat::Html);

    assert!(docs.contains("<!DOCTYPE html>"));
    assert!(docs.contains("<h1>test-cmd</h1>"));
}

#[test]
fn generate_api_docs_openapi() {
    let result = ProbeResult {
        command: "test-cmd".to_string(),
        args: vec![],
        exit_code: Some(0),
        timed_out: false,
        help_flag_detected: true,
        usage_blocks: vec![],
        options: vec![],
        subcommands: vec![],
        arguments: vec![],
        examples: vec![],
        environment_variables: vec![],
        validation_rules: vec![],
        raw_stdout: String::new(),
        raw_stderr: String::new(),
    };

    let docs = generate_api_docs(&result, DocFormat::OpenApi);

    assert!(docs.contains("\"openapi\""));
    assert!(docs.contains("\"3.0.0\""));
    assert!(docs.contains("test-cmd"));
}

#[test]
fn generate_api_docs_json_schema() {
    let result = ProbeResult {
        command: "test-cmd".to_string(),
        args: vec![],
        exit_code: Some(0),
        timed_out: false,
        help_flag_detected: true,
        usage_blocks: vec![],
        options: vec![],
        subcommands: vec![],
        arguments: vec![],
        examples: vec![],
        environment_variables: vec![],
        validation_rules: vec![],
        raw_stdout: String::new(),
        raw_stderr: String::new(),
    };

    let docs = generate_api_docs(&result, DocFormat::JsonSchema);

    assert!(docs.contains("\"$schema\""));
    assert!(docs.contains("\"title\""));
    assert!(docs.contains("test-cmd"));
}

#[test]
fn generate_api_docs_with_options() {
    use help_probe::model::OptionSpec;

    let result = ProbeResult {
        command: "test-cmd".to_string(),
        args: vec![],
        exit_code: Some(0),
        timed_out: false,
        help_flag_detected: true,
        usage_blocks: vec![],
        options: vec![OptionSpec {
            short_flags: vec!["-h".to_string()],
            long_flags: vec!["--help".to_string()],
            description: Some("Show help".to_string()),
            option_type: help_probe::model::OptionType::Boolean,
            required: false,
            default_value: None,
            takes_argument: false,
            argument_name: None,
            choices: vec![],
        }],
        subcommands: vec![],
        arguments: vec![],
        examples: vec![],
        environment_variables: vec![],
        validation_rules: vec![],
        raw_stdout: String::new(),
        raw_stderr: String::new(),
    };

    let docs = generate_api_docs(&result, DocFormat::Markdown);
    assert!(docs.contains("## Options"));
    assert!(docs.contains("--help"));
}

#[test]
fn generate_api_docs_with_arguments() {
    use help_probe::model::ArgumentSpec;

    let result = ProbeResult {
        command: "test-cmd".to_string(),
        args: vec![],
        exit_code: Some(0),
        timed_out: false,
        help_flag_detected: true,
        usage_blocks: vec![],
        options: vec![],
        subcommands: vec![],
        arguments: vec![ArgumentSpec {
            name: "FILE".to_string(),
            description: Some("Input file".to_string()),
            required: true,
            variadic: false,
            arg_type: Some(help_probe::model::ArgumentType::Path),
            placeholder: Some("<FILE>".to_string()),
        }],
        examples: vec![],
        environment_variables: vec![],
        validation_rules: vec![],
        raw_stdout: String::new(),
        raw_stderr: String::new(),
    };

    let docs = generate_api_docs(&result, DocFormat::Markdown);
    assert!(docs.contains("## Arguments"));
    assert!(docs.contains("FILE"));
}

#[test]
fn generate_api_docs_with_subcommands() {
    use help_probe::model::SubcommandSpec;

    let result = ProbeResult {
        command: "test-cmd".to_string(),
        args: vec![],
        exit_code: Some(0),
        timed_out: false,
        help_flag_detected: true,
        usage_blocks: vec![],
        options: vec![],
        subcommands: vec![SubcommandSpec {
            name: "build".to_string(),
            description: Some("Build the project".to_string()),
            full_path: "build".to_string(),
            parent: None,
            options: Vec::new(),
            arguments: Vec::new(),
            subcommands: Vec::new(),
        }],
        arguments: vec![],
        examples: vec![],
        environment_variables: vec![],
        validation_rules: vec![],
        raw_stdout: String::new(),
        raw_stderr: String::new(),
    };

    let docs = generate_api_docs(&result, DocFormat::Markdown);
    assert!(docs.contains("## Subcommands"));
    assert!(docs.contains("build"));
}

#[test]
fn generate_api_docs_with_examples() {
    use help_probe::model::Example;

    let result = ProbeResult {
        command: "test-cmd".to_string(),
        args: vec![],
        exit_code: Some(0),
        timed_out: false,
        help_flag_detected: true,
        usage_blocks: vec![],
        options: vec![],
        subcommands: vec![],
        arguments: vec![],
        examples: vec![Example {
            command: "test-cmd --help".to_string(),
            description: Some("Show help".to_string()),
            tags: vec!["basic".to_string()],
        }],
        environment_variables: vec![],
        validation_rules: vec![],
        raw_stdout: String::new(),
        raw_stderr: String::new(),
    };

    let docs = generate_api_docs(&result, DocFormat::Markdown);
    assert!(docs.contains("## Examples"));
    assert!(docs.contains("test-cmd --help"));
}