Questions about OptionParser

Hello, actually I’m programmin a package manager for my Linux Distribution with crystal.

I have some questions about OptionParser. Are there anyway to catch option but without any “–” or “-” ? This is very annoying because a lot of command line interface don’t use that. For example the command “apt install” don’t use “apt --install”.

One other question is, I seen you have an option parser.banner. Very good idea honestly ! But my question is: how I can specify with “OptionParser.parse do |parser|” when the user input nothing ? I didn’t see any method for that.

Check the example about Subcommands here

Adding an example specific to your usecase(

require "option_parser"

install = false
install_yes = false
pos_args = [] of String

parser = do |parser|
  parser.banner = "Usage: apt [subcommand] [arguments]"
  parser.on("install", "Install packages") do
    install = true
    parser.banner = "Usage: apt install [arguments]"
    parser.on("-y", "--yes", "No Prompt") { install_auto = true }

  parser.unknown_args do |args|
    pos_args = args

  parser.invalid_option do |flag|
    STDERR.puts "Invalid Option: #{flag}"
    exit 1

  parser.missing_option do |flag|
    STDERR.puts "Missing Option: #{flag}"
    exit 1


if install
  if pos_args.size == 0
    STDERR.puts "No packages specified for install"
    exit 1

  puts "Installing #{pos_args.join(", ")}"
  puts parser
  exit 1
crystal build
./apt install abcd efgh

Thanks you very much for you reply ! One other question. I had a problem when I tried to use the parser and when I use colourised string ( with colorize).

How can I colour the output without problem ? I mean after the parser do his job, how for example can I colour the banner ?

There are also some shards that make building CLIs a bit easier if you need more robust functionality: GitHub - veelenga/awesome-crystal: A collection of awesome Crystal libraries, tools, frameworks and software.

if you’re feeling adventurous, Athena’s Console component is also usable atm, but technically isn’t released so would need to pin via commit hash. I’d be happy to help with setup/usage if you go that route.