runa-tui 0.3.0

A fast, keyboard-focused terminal file browser (TUI). Highly configurable and lightweight. Previously known as runner-tui.
Documentation
use crate::config::Config;

pub enum CliAction {
    RunApp,
    Exit,
}

pub fn handle_args() -> CliAction {
    let args: Vec<String> = std::env::args().collect();
    let config_path = Config::default_path();

    if args.len() <= 1 {
        return CliAction::RunApp;
    }

    match args[1].as_str() {
        "-h" | "--help" => {
            print_help();
            CliAction::Exit
        }
        "--config-help" => {
            print_config_help();
            CliAction::Exit
        }
        "--init" => {
            if let Err(e) = Config::generate_default(&config_path, true) {
                eprintln!("Error: {}", e);
            }
            CliAction::Exit
        }
        "--init-full" => {
            if let Err(e) = Config::generate_default(&config_path, false) {
                eprintln!("Error: {}", e);
            }
            CliAction::Exit
        }
        arg => {
            eprintln!("Unknown argument: {}", arg);
            CliAction::Exit
        }
    }
}

fn print_help() {
    println!(
        r#"runa - A fast and lightweight console file browser written in Rust

USAGE:
    rn [OPTIONS]

OPTIONS:
    --help, -h            Print help information
    --init                Generate full default config at ~/.config/runa/runa.toml
    --init-minimal        Generate minimal config (overrides only)
    --config-help         Display all the configuration options

ENVIRONMENT:
    RUNA_CONFIG         Override the default config path
"#
    );
}

fn print_config_help() {
    let help_text = r##"
runa - Full Configuration Guide (runa.toml)

# General Settings
  dirs_first              (bool)  Sort directories before files
  show_hidden             (bool)  Show hidden files (dotfiles)
  show_system             (bool)  Show system/protected files
  case_insensitive        (bool)  Ignore case when searching/sorting
  always_show             (list)  List of hidden names to always show

[display]
  selection_marker        (bool)  Show the cursor marker
  dir_marker              (bool)  Show a marker for directories
  borders                 (str)   "none", "unified", or "split"
  titles                  (bool)  Show pane titles at the top
  separators              (bool)  Draw vertical lines between panes
  parent                  (bool)  Show the parent directory pane
  preview                 (bool)  Show the file preview pane
  preview_underline       (bool)  Use underline for preview selection instead of a highlighted selection
  preview_underline_color (bool)  Use underline colors instead of selection colors
  entry_padding           (usize) Entry padding for all the panes
  scroll_padding          (usize) Scroll padding of the main pane

[display.layout]
  parent                  (u16)   Width % of the parent pane
  main                    (u16)   Width % of the center pane
  preview                 (u16)   Width % of the preview pane

[theme]
  selection_icon          (str)   The cursor string (e.g., "> ")

# Theme sections          (Each supports "fg" and "bg" keys,)
[theme.selection]         Selection bar colors    fg (str), bg (str)
[theme.accent]            Border/title accents    fg (str), bg (str)
[theme.entry]             Standard entry colors   fg (str), bg (str)
[theme.directory]         Directory entry colors  fg (str), bg (str)
[theme.separator]         Vertical line colors    fg (str), bg (str)
[theme.parent]            Parent pane text        fg (str), bg (str)
[theme.preview]           Preview pane text       fg (str), bg (str)
[theme.path]              Path bar colors         fg (str), bg (str)
[theme.underline]         Underline colors        fg (str), bg (str)
[theme.widget]            Popup/widget settings:
  position                (str/list/table)  "center", "top_left", "bottom_right", [38, 32], { x = 25, y = 60 }
  size                    (str/list/table)  "small", "medium", "large", [38, 32], { w = 38, h = 32 }
[theme.widget.color]      fg/bg for popups/widgets  fg (str), bg (str)
[theme.widget.border]     fg/bg for popup borders   fg (str), bg (str)


[editor]
  cmd                    (str)   Command to open files (e.g., "nvim")

[keys]
  open_file              (list)  e.g., ["Enter"]
  go_up                  (list)  e.g., ["k", "Up"]
  go_down                (list)  e.g., ["j", "Down"]
  go_parent              (list)  e.g., ["h", "Left", "Backspace"]
  go_into_dir            (list)  e.g., ["l", "Right"]
  quit                   (list)  e.g., ["q", "Esc"]
  delete                 (list)  e.g., ["d"]
  copy                   (list)  e.g., ["y"]
  paste                  (list)  e.g., ["p"]
  rename                 (list)  e.g., ["r"]
  create                 (list)  e.g., ["n"]
  create_directory       (list)  e.g., ["Shift+n"]
  filter                 (list)  e.g., ["f"]
  toggle_marker          (list)  e.g., [" "]

Use 'Shift+x' or 'Ctrl+x' as needed. " " means space bar.

EXAMPLES:
  borders = "split"

  [display.layout]
  main = 40

  [theme.accent]
  fg = "#00ff00"
  bg = "default"
"##;

    println!("{}", help_text);
}