module Aws::Endpoints::Matchers

def self.attr(value, path)

getAttr(value: Object | Array, path: string) Document
def self.attr(value, path)
  parts = path.split('.')
  val = if (index = parts.first[BRACKET_REGEX, 1])
          # remove brackets and index from part before indexing
          value[parts.first.gsub(BRACKET_REGEX, '')][index.to_i]
        else
          value[parts.first]
        end
  if parts.size == 1
    val
  else
    attr(val, parts.slice(1..-1).join('.'))
  end
end

def self.aws_parse_arn(value)

aws.parseArn(value: string) Option
def self.aws_parse_arn(value)
  arn = Aws::ARNParser.parse(value)
  json = arn.as_json
  # HACK: because of poor naming and also requirement of splitting
  resource = json.delete('resource')
  json['resourceId'] = resource.split(%r{[:\/]}, -1)
  json
rescue Aws::Errors::InvalidARNError
  nil
end

def self.aws_partition(value)

aws.partition(value: string) Option
def self.aws_partition(value)
  partition =
    Aws::Partitions.find { |p| p.region?(value) } ||
    Aws::Partitions.find { |p| value.match(p.region_regex) } ||
    Aws::Partitions.find { |p| p.name == 'aws' }
  return nil unless partition
  partition.metadata
end

def self.aws_virtual_hostable_s3_bucket?(value, allow_sub_domains = false)

aws.isVirtualHostableS3Bucket(value: string, allowSubDomains: bool) bool
def self.aws_virtual_hostable_s3_bucket?(value, allow_sub_domains = false)
  return false if value.empty?
  if allow_sub_domains
    labels = value.split('.', -1)
    return labels.all? { |l| aws_virtual_hostable_s3_bucket?(l) }
  end
  # must be between 3 and 63 characters long, no uppercase
  value =~ /\A(?!-)[a-z0-9-]{3,63}(?<!-)\z/ &&
    # not an IP address
    value !~ /(\d+\.){3}\d+/
end

def self.boolean_equals?(value1, value2)

booleanEquals(value1: bool, value2: bool) bool
def self.boolean_equals?(value1, value2)
  value1 == value2
end

def self.not(bool)

not(value: bool) bool
def self.not(bool)
  !bool
end

def self.parse_url(value)

parseUrl(value: string) Option
def self.parse_url(value)
  URL.new(value).as_json
rescue ArgumentError, URI::InvalidURIError
  nil
end

def self.set?(value)

isSet(value: Option) bool
def self.set?(value)
  !value.nil?
end

def self.string_equals?(value1, value2)

stringEquals(value1: string, value2: string) bool
def self.string_equals?(value1, value2)
  value1 == value2
end

def self.substring(input, start, stop, reverse)

def self.substring(input, start, stop, reverse)
  return nil if start >= stop || input.size < stop
  return nil if input.chars.any? { |c| c.ord > 127 }
  return input[start...stop] unless reverse
  r_start = input.size - stop
  r_stop = input.size - start
  input[r_start...r_stop]
end

def self.uri_encode(value)

uriEncode(value: string) string
def self.uri_encode(value)
  CGI.escape(value.encode('UTF-8')).gsub('+', '%20').gsub('%7E', '~')
end

def self.valid_host_label?(value, allow_sub_domains = false)

isValidHostLabel(value: string, allowSubDomains: bool) bool
def self.valid_host_label?(value, allow_sub_domains = false)
  return false if value.empty?
  if allow_sub_domains
    labels = value.split('.', -1)
    return labels.all? { |l| valid_host_label?(l) }
  end
  !!(value =~ /\A(?!-)[a-zA-Z0-9-]{1,63}(?<!-)\z/)
end