# Requirements # ======================================================================= # stdlib # deps # package require_relative './cli/help' require_relative './cli/play' require_relative './cli/run' require_relative './cli/setup' # Requirements # ======================================================================= require 'nrser/refinements' using NRSER # Declarations # ======================================================================= module QB; end # Definitions # ======================================================================= module QB::CLI # Eigenclass (Singleton Class) # ======================================================================== # class << self # @todo Document ask method. # # @param [type] arg_name # @todo Add name param description. # # @return [return_type] # @todo Document return value. # def ask name:, description: nil, type:, default: NRSER::NO_ARG puts value = loop do puts "Enter value for #{ name }" if description puts description.indent end puts "TYPE #{ type.to_s }".indent if default puts "DEFAULT #{ default.to_s }".indent end $stdout.write '> ' value = gets.chomp QB.debug "User input", value if value == '' && default != NRSER::NO_ARG puts <<-END.dedent Using default value #{ default.to_s } END return default end begin type.from_s value rescue TypeError => e puts <<-END.dedent Input value #{ value.inspect } failed to satisfy type #{ type.to_s } END else break value end end # loop puts "Using value #{ value.inspect }" return value end # #ask def ask_for_option role:, option: default = if role.defaults.key?(option.var_name) role.defaults[option.var_name] elsif option.required? NRSER::NO_ARG else nil end ask name: option.name, description: option.description, default: default # type: end def ask_for_options role:, options: options.select { |opt| opt.value.nil? }.each { |option| ask_for_option role: role, option: option } end # #ask_for_options end # class << self (Eigenclass) end # module QB::CLI