module SumsUp::Core::Parser

Validates and normalizes arguments passed to SumsUp.define.

Constants

LOWER_SNAKE_CASE_REGEXP

Public Instance Methods

parse_variant_specs!(no_arg_variants, arg_variants) click to toggle source
# File lib/sums_up/core/parser.rb, line 11
def parse_variant_specs!(no_arg_variants, arg_variants)
  variant_names = no_arg_variants + arg_variants.keys

  validate_unique!(variant_names)
  variant_names.each(&method(:validate_name_format!))
  arg_variants.each_value(&method(:validate_variant_args!))

  no_arg_variants
    .map { |variant| [variant, []] }
    .to_h
    .merge(arg_variants.map { |key, ary| [key, [*ary]] }.to_h)
end
validate_name_format!(variant_name) click to toggle source
# File lib/sums_up/core/parser.rb, line 38
def validate_name_format!(variant_name)
  unless variant_name.is_a?(Symbol)
    raise(VariantNameError, "Expected a Symbol, got: #{variant_name}")
  end

  return if LOWER_SNAKE_CASE_REGEXP.match(variant_name.to_s)

  raise(
    VariantNameError,
    "Name is not lower_snake_case: #{variant_name}"
  )
end
validate_unique!(variant_names) click to toggle source
# File lib/sums_up/core/parser.rb, line 24
def validate_unique!(variant_names)
  duplicates = variant_names
    .group_by(&:itself)
    .select { |_, values| values.length > 1 }
    .keys

  return if duplicates.empty?

  raise(
    DuplicateNameError,
    "Duplicated names: #{duplicates.join(', ')}"
  )
end
validate_variant_args!(variant_args) click to toggle source
# File lib/sums_up/core/parser.rb, line 51
def validate_variant_args!(variant_args)
  case variant_args
  when Symbol
    validate_name_format!(variant_args)
  when Array
    variant_args.each(&method(:validate_name_format!))

    validate_unique!(variant_args)
  else
    raise(
      VariantArgsError,
      "Expected a Symbol or Array, got: #{variant_args}"
    )
  end
end