class Geocoder::Result::Mapbox

def address

def address
  data['place_name']
end

def city

def city
  data_part('place') || context_part('place')
end

def context

def context
  Array(data['context'])
end

def context_part(name, key = 'text')

def context_part(name, key = 'text')
  (context.detect { |c| id_matches_name?(c['id'], name) } || {})[key]
end

def coordinates

def coordinates
  data['geometry']['coordinates'].reverse.map(&:to_f)
end

def country

def country
  data_part('country') || context_part('country')
end

def country_code

def country_code
  if id_matches_name?(data['id'], 'country')
    value = data['properties']['short_code']
  else
    value = context_part('country', 'short_code')
  end
  value.upcase unless value.nil?
end

def data_part(name)

def data_part(name)
  data['text'] if id_matches_name?(data['id'], name)
end

def id_matches_name?(id, name)

def id_matches_name?(id, name)
  id =~ Regexp.new(name)
end

def neighborhood

def neighborhood
  data_part('neighborhood') || context_part('neighborhood')
end

def place_name

def place_name
  data['text']
end

def postal_code

def postal_code
  data_part('postcode') || context_part('postcode')
end

def state

def state
  data_part('region') || context_part('region')
end

def state_code

def state_code
  if id_matches_name?(data['id'], 'region')
    value = data['properties']['short_code']
  else
    value = context_part('region', 'short_code')
  end
  value.split('-').last unless value.nil?
end

def street

def street
  data['properties']['address']
end