Sha256: 9215995531e431325cc0c0af4e3883291d7a10c0669f8acde24d2ff4484232f3

Contents?: true

Size: 1.42 KB

Versions: 1

Compression:

Stored size: 1.42 KB

Contents

# frozen_string_literal: true

module Esse
  module CLI
    module Parser
      FALSEY = [false, 'false', 'FALSE', 'f', 'F'].freeze
      TRUTHY = [true, 'true', 'TRUE', 't', 'T'].freeze
      HASH_MATCHER = /([\w\.\-]+)\:([^\s]+)/.freeze
      HASH_SEPARATOR = /[\s]+/.freeze
      ARRAY_SEPARATOR = /[\,]+/.freeze

      class BoolOrHash
        def initialize(key, default: nil)
          @key = key
          @default = default
        end

        def parse(input)
          return true if TRUTHY.include?(input)
          return false if FALSEY.include?(input)
          return input if input.is_a?(Hash)
          return @default if input.nil?
          return true if @key.to_s == input
          return @default unless HASH_MATCHER.match?(input)

          compact_hash = input.to_s.split(HASH_SEPARATOR).each_with_object({}) do |pair, hash|
            key, val = pair.match(HASH_MATCHER).captures
            hash[key.to_sym] = may_array(val)
          end
          return @default if compact_hash.empty?

          Esse::HashUtils.explode_keys(compact_hash)
        end

        private

        def may_array(value)
          return may_bool(value) unless ARRAY_SEPARATOR.match?(value)

          value.split(ARRAY_SEPARATOR).map { |v| may_bool(v) }
        end

        def may_bool(value)
          return true if TRUTHY.include?(value)
          return false if FALSEY.include?(value)

          value
        end
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
esse-0.4.0.rc3 lib/esse/cli/parser/bool_or_hash.rb