Class: Pvectl::ArgvPreprocessor

Inherits:
Object
  • Object
show all
Defined in:
lib/pvectl/argv_preprocessor.rb

Overview

Command line argument preprocessor.

Normalizes ARGV arguments before passing to GLI by reordering flags to appear before positional arguments, using GLI command metadata for dynamic flag discovery.

GLI with ‘subcommand_option_handling :normal` requires flags before positional arguments. This preprocessor allows kubectl-style flag placement anywhere on the command line.

Examples:

Global flags moved to beginning

ArgvPreprocessor.process(["get", "nodes", "-o", "json"], cli_app: CLI)
#=> ["-o", "json", "get", "nodes"]

Command flags moved before positional args

ArgvPreprocessor.process(["delete", "vm", "103", "--yes"], cli_app: CLI)
#=> ["delete", "--yes", "vm", "103"]

Passthrough mode for –help

ArgvPreprocessor.process(["--help", "get"], cli_app: CLI)
#=> ["--help", "get"]  # unchanged

Defined Under Namespace

Classes: DuplicateFlagError

Constant Summary collapse

MAX_ARGUMENTS =

Returns Maximum number of arguments (DoS protection).

Returns:

  • (Integer)

    Maximum number of arguments (DoS protection)

10_000
MAX_ARGUMENT_LENGTH =

Returns Maximum length of single argument in bytes.

Returns:

  • (Integer)

    Maximum length of single argument in bytes

4096
PASSTHROUGH_FLAGS =

Returns Flags passed through without processing.

Returns:

  • (Array<String>)

    Flags passed through without processing

%w[--help -h --version].freeze

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(argv, cli_app: Pvectl::CLI) ⇒ ArgvPreprocessor

Initializes preprocessor with a copy of arguments.

Parameters:

  • argv (Array<String>)

    command line arguments

  • cli_app (GLI::App) (defaults to: Pvectl::CLI)

    CLI application with registered commands



63
64
65
66
# File 'lib/pvectl/argv_preprocessor.rb', line 63

def initialize(argv, cli_app: Pvectl::CLI)
  @argv = argv.dup
  @cli_app = cli_app
end

Class Method Details

.process(argv, cli_app: Pvectl::CLI) ⇒ Array<String>

Processes command line arguments.

Parameters:

  • argv (Array<String>)

    command line arguments

  • cli_app (GLI::App) (defaults to: Pvectl::CLI)

    CLI application with registered commands

Returns:

  • (Array<String>)

    normalized arguments

Raises:

  • (ArgumentError)

    when input limits are exceeded

  • (DuplicateFlagError)

    when global flag has different values



55
56
57
# File 'lib/pvectl/argv_preprocessor.rb', line 55

def self.process(argv, cli_app: Pvectl::CLI)
  new(argv, cli_app: cli_app).call
end

Instance Method Details

#callArray<String>

Executes argument processing.

Returns:

  • (Array<String>)

    normalized arguments

Raises:

  • (ArgumentError)

    when input limits are exceeded

  • (DuplicateFlagError)

    when global flag has different values



73
74
75
76
77
78
79
# File 'lib/pvectl/argv_preprocessor.rb', line 73

def call
  validate_input_limits!
  return @argv if passthrough_mode?
  return [] if @argv.empty?

  reorder_all_flags
end