Skip to content

Instantly share code, notes, and snippets.

@havenwood
Created December 28, 2025 02:19
Show Gist options
  • Select an option

  • Save havenwood/9aef94d56d33001f445b895ea803ca2a to your computer and use it in GitHub Desktop.

Select an option

Save havenwood/9aef94d56d33001f445b895ea803ca2a to your computer and use it in GitHub Desktop.
An example showing OptionParser backed by Data
require 'delegate'
require 'optparse'
class Options < SimpleDelegator
def initialize(argv = ARGV, &)
parser = OptionParser.new(&)
members = members_from parser
values = values_from parser, argv
data = data_from members, values
super(data)
end
private
def members_from(parser)
parser.top.list.map do |option|
format option.switch_name
end
end
def values_from(parser, argv)
into = {}
parser.parse!(argv, into:)
into.transform_keys { |key| format key.name }
end
def data_from(members, values)
self.class.const_set(:Into, Data.define(*members))
Into.new(*values.values_at(*members))
end
def format(option) = option.tr('-', '_').to_sym
end
if __FILE__ == $PROGRAM_NAME
options = Options.new do |parser|
parser.on '--verbose'
end
warn 'verbose' if options.verbose
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment