use std::{fmt::Display, str::FromStr};
use clap::Parser;
use crate::options::{GeneralOptions, ProjectOptions};
#[derive(Copy, Clone, PartialEq, Eq, Debug)]
pub enum SortBy {
Name,
Visibility,
Kind,
}
impl FromStr for SortBy {
type Err = &'static str;
fn from_str(s: &str) -> Result<Self, Self::Err> {
match s {
"name" => Ok(Self::Name),
"visibility" => Ok(Self::Visibility),
"kind" => Ok(Self::Kind),
_ => Err("Unrecognized sort order"),
}
}
}
impl Display for SortBy {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(match self {
Self::Name => "name",
Self::Visibility => "visibility",
Self::Kind => "kind",
})
}
}
#[derive(Parser, Clone, PartialEq, Eq, Debug)]
#[group(id = "GenerateTreeOptions")]
pub struct Options {
#[command(flatten)]
pub general: GeneralOptions,
#[command(flatten)]
pub project: ProjectOptions,
#[command(flatten)]
pub selection: SelectionOptions,
#[arg(long = "sort-by", default_value = "name")]
pub sort_by: SortBy,
#[arg(long = "sort-reversed")]
pub sort_reversed: bool,
#[arg(long = "focus-on")]
pub focus_on: Option<String>,
#[arg(long = "max-depth")]
pub max_depth: Option<usize>,
#[arg(long = "cfg-test")]
pub cfg_test: bool,
}
#[derive(Parser, Clone, PartialEq, Eq, Debug)]
#[group(id = "SelectionOptions")]
pub struct SelectionOptions {
#[arg(long = "no-fns")]
pub no_fns: bool,
#[arg(long = "no-traits")]
pub no_traits: bool,
#[arg(long = "no-types")]
pub no_types: bool,
}