Source code for ascetic_ddd.seedwork.domain.values.point

from abc import ABCMeta, abstractmethod
from decimal import Decimal

try:
    from geopy import Point as _Point
except ImportError:

    class _Point:
        pass

__all__ = (
    "Point",
    "IPointExporter",
)


# TODO: Fix interface
[docs] class Point(_Point): def __new__(cls, latitude: Decimal, longitude: Decimal, altitude: Decimal | None = None): if latitude is None and longitude is None and altitude is None: return EmptyPoint() return super().__new__(cls, latitude, longitude, altitude)
[docs] def export(self, exporter: "IPointExporter") -> None: exporter.longitude = Decimal(self.longitude).quantize(Decimal(".000001")) exporter.latitude = Decimal(self.latitude).quantize(Decimal(".000001")) exporter.altitude = ( bool(self.altitude) and Decimal(self.altitude).quantize(Decimal(".000001")) or None )
[docs] @staticmethod def empty() -> "EmptyPoint": return EmptyPoint()
@property def is_empty(self) -> bool: return self == EmptyPoint()
class EmptyPoint(Point): def __new__(cls): return _Point.__new__(cls) def export(self, exporter: "IPointExporter") -> None: exporter.set_longitude(None) exporter.set_latitude(None) exporter.set_altitude(None)
[docs] class IPointExporter(metaclass=ABCMeta):
[docs] @abstractmethod def set_longitude(self, value: Decimal | None) -> None: raise NotImplementedError
[docs] @abstractmethod def set_latitude(self, value: Decimal | None) -> None: raise NotImplementedError
[docs] @abstractmethod def set_altitude(self, value: Decimal | None) -> None: raise NotImplementedError