use clap::Parser;
use std::path::PathBuf;
use crate::cli::format::OutputFormat;
use crate::data::{ExtractorConfig, Profile, VariableScope};
#[derive(Parser, Debug, Clone)]
#[allow(clippy::struct_excessive_bools, reason = "CLI argument boolean flags")]
#[command(
name = "rs-teststand-autodoc",
version,
about = "Safe, blazing-fast TestStand sequence documentation generator"
)]
pub struct CliArgs {
#[arg(required = true)]
pub files: Vec<PathBuf>,
#[arg(short, long)]
pub output: Option<PathBuf>,
#[arg(short, long, value_enum, default_value_t = Profile::Engineer)]
pub profile: Profile,
#[arg(long, value_enum, default_value_t = OutputFormat::Markdown)]
pub format: OutputFormat,
#[arg(long)]
pub no_flowcharts: bool,
#[arg(long)]
pub no_recurse: bool,
#[arg(long, default_value_t = 3)]
pub max_depth: usize,
#[arg(long)]
pub include_station_options: bool,
#[arg(long)]
pub include_types: bool,
#[arg(long)]
pub include_file_custom_data_types: bool,
#[arg(long = "sequence", value_name = "NAME")]
pub sequences: Vec<String>,
#[arg(long, default_value = "")]
pub author: String,
#[arg(long, default_value = "")]
pub company: String,
#[arg(long, default_value = "")]
pub email: String,
#[arg(long, default_value = "1.0.0")]
pub doc_version: String,
#[arg(long)]
pub show_paths: bool,
#[arg(long)]
pub logo: Option<String>,
}
impl CliArgs {
#[must_use]
pub fn to_extractor_config(&self) -> ExtractorConfig {
ExtractorConfig {
profile: self.profile,
rules: crate::rules::DocumentRules::for_profile(self.profile),
only_sequences: self.sequences.clone(),
include_process_models: false,
include_scopes: vec![
VariableScope::Locals,
VariableScope::Parameters,
VariableScope::FileGlobals,
],
ignore_skipped: false,
include_flowcharts: !self.no_flowcharts,
include_station_options: self.include_station_options,
include_types: self.include_types,
include_file_custom_data_types: self.include_file_custom_data_types,
types_attached_only: true,
estimate_software_delays: false,
detailed_popup_messages: true,
author: self.author.clone(),
company: self.company.clone(),
email: self.email.clone(),
version: self.doc_version.clone(),
show_paths: self.show_paths,
recurse_subsequences: !self.no_recurse,
max_depth: self.max_depth,
company_logo: self.logo.clone(),
}
}
}