2026-02-07 20:19:57 +00:00
|
|
|
import dataclasses
|
2026-02-06 20:55:10 +00:00
|
|
|
import json
|
|
|
|
|
from typing import List
|
|
|
|
|
|
|
|
|
|
from models.listing import DestinationMode, Route, RouteLegStep
|
|
|
|
|
from rec import routing
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class RouteSerializer:
|
|
|
|
|
@staticmethod
|
2026-02-07 20:19:57 +00:00
|
|
|
def serialize(routing_info: dict[DestinationMode, list[Route]]) -> str:
|
|
|
|
|
return json.dumps(
|
|
|
|
|
{
|
|
|
|
|
json.dumps(dataclasses.asdict(destination_mode)): [
|
|
|
|
|
json.dumps(dataclasses.asdict(route)) for route in routes
|
|
|
|
|
]
|
|
|
|
|
for destination_mode, routes in routing_info.items()
|
|
|
|
|
}
|
|
|
|
|
)
|
2026-02-06 20:55:10 +00:00
|
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
|
def deserialize(route_data_json: str) -> dict[DestinationMode, List[Route]]:
|
|
|
|
|
json_data = json.loads(route_data_json)
|
2026-02-07 20:19:57 +00:00
|
|
|
destination_routes = {}
|
2026-02-06 20:55:10 +00:00
|
|
|
for destination_mode_str, routes_json in json_data.items():
|
2026-02-07 20:19:57 +00:00
|
|
|
parsed_destination = json.loads(destination_mode_str)
|
2026-02-06 20:55:10 +00:00
|
|
|
destination_mode = DestinationMode(
|
2026-02-07 20:19:57 +00:00
|
|
|
destination_address=parsed_destination["destination_address"],
|
|
|
|
|
travel_mode=routing.TravelMode(parsed_destination["travel_mode"]),
|
2026-02-06 20:55:10 +00:00
|
|
|
)
|
|
|
|
|
parsed_route = json.loads(routes_json[0])
|
|
|
|
|
routes = [
|
|
|
|
|
Route(
|
|
|
|
|
legs=[
|
|
|
|
|
RouteLegStep(
|
|
|
|
|
distance_meters=step["distance_meters"],
|
|
|
|
|
duration_s=step["duration_s"],
|
|
|
|
|
travel_mode=routing.TravelMode(step["travel_mode"]),
|
|
|
|
|
)
|
|
|
|
|
for step in parsed_route["legs"]
|
|
|
|
|
],
|
|
|
|
|
distance_meters=parsed_route["distance_meters"],
|
|
|
|
|
duration_s=int(parsed_route["duration_s"]),
|
|
|
|
|
)
|
|
|
|
|
]
|
2026-02-07 20:19:57 +00:00
|
|
|
destination_routes[destination_mode] = routes
|
|
|
|
|
return destination_routes
|