Skip to content

Commit

Permalink
Simplify highlighter options in CLI
Browse files Browse the repository at this point in the history
- Use enums for enable/disable highlighters
- Remove redundant boolean fields
- Refactor functions to accommodate changes
  • Loading branch information
bensadeh committed Oct 12, 2024
1 parent cd6bbc0 commit ad3b437
Show file tree
Hide file tree
Showing 4 changed files with 59 additions and 195 deletions.
109 changes: 22 additions & 87 deletions src/cli/mod.rs
Original file line number Diff line number Diff line change
@@ -1,10 +1,25 @@
pub mod keywords;

use clap::{Command, CommandFactory, Parser};
use clap::{Command, CommandFactory, Parser, ValueEnum};
use clap_complete::{generate, Generator, Shell};
use std::io;
use std::process::exit;

#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, ValueEnum)]
pub enum HighlighterGroup {
Numbers,
Urls,
Pointers,
Dates,
Paths,
Quotes,
KeyValuePairs,
Uuids,
IpAddresses,
Processes,
Json,
}

#[derive(Parser)]
#[command(name = "tspin")]
#[command(author, version, about)]
Expand Down Expand Up @@ -57,93 +72,13 @@ pub struct Cli {
#[clap(long = "words-cyan", use_value_delimiter = true)]
pub words_cyan: Vec<String>,

/// Enable the highlighting of numbers
#[clap(long = "enable-numbers")]
pub enable_numbers: bool,

/// Enable the highlighting of dates
#[clap(long = "enable-dates")]
pub enable_dates: bool,

/// Enable the highlighting of URLs
#[clap(long = "enable-urls")]
pub enable_urls: bool,

/// Enable the highlighting of paths
#[clap(long = "enable-paths")]
pub enable_paths: bool,

/// Enable the highlighting of quotes
#[clap(long = "enable-quotes")]
pub enable_quotes: bool,

/// Enable the highlighting of key value pairs
#[clap(long = "enable-key-value-pairs")]
pub enable_key_value_pairs: bool,

/// Enable the highlighting of UUIDs
#[clap(long = "enable-uuids")]
pub enable_uuids: bool,

/// Enable the highlighting of IP addresses
#[clap(long = "enable-ip-addresses")]
pub enable_ip_addresses: bool,

/// Enable the highlighting of pointers
#[clap(long = "enable-pointers")]
pub enable_pointers: bool,

/// Enable the highlighting of unix processes
#[clap(long = "enable-processes")]
pub enable_processes: bool,

/// Enable the highlighting of JSON
#[clap(long = "enable-json")]
pub enable_json: bool,

/// Disable the highlighting of numbers
#[clap(long = "disable-numbers")]
pub disable_numbers: bool,

/// Disable the highlighting of dates
#[clap(long = "disable-dates")]
pub disable_dates: bool,

/// Disable the highlighting of URLs
#[clap(long = "disable-urls")]
pub disable_urls: bool,

/// Disable the highlighting of paths
#[clap(long = "disable-paths")]
pub disable_paths: bool,

/// Disable the highlighting of quotes
#[clap(long = "disable-quotes")]
pub disable_quotes: bool,

/// Disable the highlighting of key value pairs
#[clap(long = "disable-key-value-pairs")]
pub disable_key_value_pairs: bool,

/// Disable the highlighting of UUIDs
#[clap(long = "disable-uuids")]
pub disable_uuids: bool,

/// Disable the highlighting of IP addresses
#[clap(long = "disable-ip-addresses")]
pub disable_ip_addresses: bool,

/// Disable the highlighting of pointers
#[clap(long = "disable-pointers")]
pub disable_pointers: bool,

/// Disable the highlighting of unix processes
#[clap(long = "disable-processes")]
pub disable_processes: bool,
/// Enable specific highlighters
#[clap(long = "enable", value_enum, use_value_delimiter = true)]
pub enable: Vec<HighlighterGroup>,

/// Disable the highlighting of JSON
#[clap(long = "disable-json")]
pub disable_json: bool,
/// Disable specific highlighters
#[clap(long = "disable", value_enum, use_value_delimiter = true)]
pub disable: Vec<HighlighterGroup>,

/// Disable the highlighting of all builtin keyword groups (booleans, nulls, log severities and common REST verbs)
#[clap(long = "no-builtin-keywords")]
Expand Down
28 changes: 0 additions & 28 deletions src/config/mod.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
use crate::cli::Cli;
use crate::highlighter_builder::groups::CliOpts;
use crate::types::{
Config, Error, FolderInfo, Input, Output, PathAndLineCount, GENERAL_ERROR, MISUSE_SHELL_BUILTIN, OK,
};
Expand Down Expand Up @@ -213,30 +212,3 @@ fn count_lines<P: AsRef<Path>>(file_path: P) -> usize {

reader.lines().count()
}

pub const fn get_cli_opts_for_highlight_groups(cli: &Cli) -> CliOpts {
CliOpts {
enable_numbers: cli.enable_numbers,
disable_numbers: cli.disable_numbers,
enable_uuids: cli.enable_uuids,
disable_uuids: cli.disable_uuids,
enable_quotes: cli.enable_quotes,
disable_quotes: cli.disable_quotes,
enable_ip_addresses: cli.enable_ip_addresses,
disable_ip_addresses: cli.disable_ip_addresses,
enable_dates: cli.enable_dates,
disable_dates: cli.disable_dates,
enable_paths: cli.enable_paths,
disable_paths: cli.disable_paths,
enable_urls: cli.enable_urls,
disable_urls: cli.disable_urls,
enable_pointers: cli.enable_pointers,
disable_pointers: cli.disable_pointers,
enable_processes: cli.enable_processes,
disable_processes: cli.disable_processes,
enable_key_value_pairs: cli.enable_key_value_pairs,
disable_key_value_pairs: cli.disable_key_value_pairs,
enable_json: cli.enable_json,
disable_json: cli.disable_json,
}
}
114 changes: 36 additions & 78 deletions src/highlighter_builder/groups.rs
Original file line number Diff line number Diff line change
@@ -1,33 +1,8 @@
use crate::cli::HighlighterGroup;
use std::fmt::Debug;
use thiserror::Error;
use HighlighterConfigNew::*;

#[derive(Copy, Clone)]
pub struct CliOpts {
pub enable_numbers: bool,
pub disable_numbers: bool,
pub enable_uuids: bool,
pub disable_uuids: bool,
pub enable_quotes: bool,
pub disable_quotes: bool,
pub enable_ip_addresses: bool,
pub disable_ip_addresses: bool,
pub enable_dates: bool,
pub disable_dates: bool,
pub enable_paths: bool,
pub disable_paths: bool,
pub enable_urls: bool,
pub disable_urls: bool,
pub enable_pointers: bool,
pub disable_pointers: bool,
pub enable_processes: bool,
pub disable_processes: bool,
pub enable_key_value_pairs: bool,
pub disable_key_value_pairs: bool,
pub enable_json: bool,
pub disable_json: bool,
}

pub enum HighlighterConfigNew {
AllHighlightersEnabled,
SomeHighlightersEnabled,
Expand Down Expand Up @@ -71,69 +46,52 @@ impl HighlighterGroups {
}
}

pub const fn get_highlighter_groups(cli: CliOpts) -> Result<HighlighterGroups, ConfigError> {
match determine_highlighter_type(cli) {
pub fn get_highlighter_groups(
enabled: &[HighlighterGroup],
disabled: &[HighlighterGroup],
) -> Result<HighlighterGroups, ConfigError> {
match determine_highlighter_type_new(enabled, disabled) {
AllHighlightersEnabled => Ok(HighlighterGroups::all_enabled()),
SomeHighlightersEnabled => Ok(HighlighterGroups {
numbers: cli.enable_numbers,
uuids: cli.enable_uuids,
quotes: cli.enable_quotes,
ip_addresses: cli.enable_ip_addresses,
dates: cli.enable_dates,
paths: cli.enable_paths,
urls: cli.enable_urls,
pointers: cli.enable_pointers,
processes: cli.enable_processes,
key_value_pairs: cli.enable_key_value_pairs,
json: cli.enable_json,
numbers: enabled.contains(&HighlighterGroup::Numbers),
uuids: enabled.contains(&HighlighterGroup::Uuids),
quotes: enabled.contains(&HighlighterGroup::Quotes),
ip_addresses: enabled.contains(&HighlighterGroup::IpAddresses),
dates: enabled.contains(&HighlighterGroup::Dates),
paths: enabled.contains(&HighlighterGroup::Paths),
urls: enabled.contains(&HighlighterGroup::Urls),
pointers: enabled.contains(&HighlighterGroup::Pointers),
processes: enabled.contains(&HighlighterGroup::Processes),
key_value_pairs: enabled.contains(&HighlighterGroup::KeyValuePairs),
json: enabled.contains(&HighlighterGroup::Json),
}),
SomeHighlightersDisabled => Ok(HighlighterGroups {
numbers: !cli.disable_numbers,
uuids: !cli.disable_uuids,
quotes: !cli.disable_quotes,
ip_addresses: !cli.disable_ip_addresses,
dates: !cli.disable_dates,
paths: !cli.disable_paths,
urls: !cli.disable_urls,
pointers: !cli.disable_pointers,
processes: !cli.disable_processes,
key_value_pairs: !cli.disable_key_value_pairs,
json: !cli.disable_json,
numbers: !disabled.contains(&HighlighterGroup::Numbers),
uuids: !disabled.contains(&HighlighterGroup::Uuids),
quotes: !disabled.contains(&HighlighterGroup::Quotes),
ip_addresses: !disabled.contains(&HighlighterGroup::IpAddresses),
dates: !disabled.contains(&HighlighterGroup::Dates),
paths: !disabled.contains(&HighlighterGroup::Paths),
urls: !disabled.contains(&HighlighterGroup::Urls),
pointers: !disabled.contains(&HighlighterGroup::Pointers),
processes: !disabled.contains(&HighlighterGroup::Processes),
key_value_pairs: !disabled.contains(&HighlighterGroup::KeyValuePairs),
json: !disabled.contains(&HighlighterGroup::Json),
}),
Mismatch => Err(ConfigError::ConflictEnableDisable),
}
}

pub const fn determine_highlighter_type(cli: CliOpts) -> HighlighterConfigNew {
let some_enabled = cli.enable_numbers
|| cli.enable_uuids
|| cli.enable_quotes
|| cli.enable_ip_addresses
|| cli.enable_dates
|| cli.enable_paths
|| cli.enable_urls
|| cli.enable_pointers
|| cli.enable_processes
|| cli.enable_key_value_pairs
|| cli.enable_json;

let some_disabled = cli.disable_numbers
|| cli.disable_uuids
|| cli.disable_quotes
|| cli.disable_ip_addresses
|| cli.disable_dates
|| cli.disable_paths
|| cli.disable_urls
|| cli.disable_pointers
|| cli.disable_processes
|| cli.disable_key_value_pairs
|| cli.disable_json;
pub const fn determine_highlighter_type_new(
enabled: &[HighlighterGroup],
disabled: &[HighlighterGroup],
) -> HighlighterConfigNew {
let some_enabled = !enabled.is_empty();
let some_disabled = !disabled.is_empty();

let all_enabled = cli.enable_numbers && cli.enable_paths && cli.enable_urls;
let all_disabled = cli.disable_numbers && cli.disable_paths && cli.disable_urls;
let none_enabled = enabled.is_empty();
let none_disabled = disabled.is_empty();

let none_enabled = !all_enabled;
let none_disabled = !all_disabled;
let only_some_enabled = some_enabled && none_disabled;
let only_some_disabled = some_disabled && none_enabled;

Expand Down
3 changes: 1 addition & 2 deletions src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,7 @@ async fn main() -> Result<()> {
let cli = cli::get_args_or_exit_early();
let config = config::create_config_or_exit_early(&cli);

let cli_options = config::get_cli_opts_for_highlight_groups(&cli);
let highlighter_groups = groups::get_highlighter_groups(cli_options)?;
let highlighter_groups = groups::get_highlighter_groups(&cli.enable, &cli.disable)?;

let new_theme = reader::parse_theme(cli.config_path.clone())?;
let keywords_from_cli = get_keywords_from_cli(&cli);
Expand Down

0 comments on commit ad3b437

Please sign in to comment.