"""Distance util functions.""" import logging from numbers import Number from homeassistant.const import ( LENGTH_KILOMETERS, LENGTH_MILES, LENGTH_FEET, LENGTH_METERS, UNIT_NOT_RECOGNIZED_TEMPLATE, LENGTH, ) _LOGGER = logging.getLogger(__name__) VALID_UNITS = [ LENGTH_KILOMETERS, LENGTH_MILES, LENGTH_FEET, LENGTH_METERS, ] def convert(value: float, unit_1: str, unit_2: str) -> float: """Convert one unit of measurement to another.""" if unit_1 not in VALID_UNITS: raise ValueError( UNIT_NOT_RECOGNIZED_TEMPLATE.format(unit_1, LENGTH)) if unit_2 not in VALID_UNITS: raise ValueError( UNIT_NOT_RECOGNIZED_TEMPLATE.format(unit_2, LENGTH)) if not isinstance(value, Number): raise TypeError('{} is not of numeric type'.format(value)) # type ignore: https://github.com/python/mypy/issues/7207 if unit_1 == unit_2 or unit_1 not in VALID_UNITS: # type: ignore return value meters = value if unit_1 == LENGTH_MILES: meters = __miles_to_meters(value) elif unit_1 == LENGTH_FEET: meters = __feet_to_meters(value) elif unit_1 == LENGTH_KILOMETERS: meters = __kilometers_to_meters(value) result = meters if unit_2 == LENGTH_MILES: result = __meters_to_miles(meters) elif unit_2 == LENGTH_FEET: result = __meters_to_feet(meters) elif unit_2 == LENGTH_KILOMETERS: result = __meters_to_kilometers(meters) return result def __miles_to_meters(miles: float) -> float: """Convert miles to meters.""" return miles * 1609.344 def __feet_to_meters(feet: float) -> float: """Convert feet to meters.""" return feet * 0.3048 def __kilometers_to_meters(kilometers: float) -> float: """Convert kilometers to meters.""" return kilometers * 1000 def __meters_to_miles(meters: float) -> float: """Convert meters to miles.""" return meters * 0.000621371 def __meters_to_feet(meters: float) -> float: """Convert meters to feet.""" return meters * 3.28084 def __meters_to_kilometers(meters: float) -> float: """Convert meters to kilometers.""" return meters * 0.001