| from __future__ import annotations |
|
|
| import os |
| from typing import Literal |
|
|
| Mode = Literal["Walk", "Transit", "Drive/Taxi"] |
|
|
| def _get_float(name: str, default: float) -> float: |
| try: |
| return float(os.getenv(name, default)) |
| except Exception: |
| return default |
|
|
| |
| TAXI_BASE_FARE = _get_float("TAXI_BASE_FARE", 500.0) |
| TAXI_PER_KM = _get_float("TAXI_PER_KM", 320.0) |
| TAXI_PER_MIN = _get_float("TAXI_PER_MIN", 0.0) |
|
|
| TRANSIT_BASE = _get_float("TRANSIT_BASE_FARE", 210.0) |
| TRANSIT_PER_KM= _get_float("TRANSIT_PER_KM", 25.0) |
|
|
| def estimate_leg_cost(mode: Mode, distance_km: float, duration_min: float, fare_hint: float | None = None) -> float: |
| """1区間の概算費用(JPY)を返す。公共交通はAPIのfare_hint優先。""" |
| if mode == "Walk": |
| return 0.0 |
| if mode == "Drive/Taxi": |
| return TAXI_BASE_FARE + TAXI_PER_KM * max(0.0, distance_km) + TAXI_PER_MIN * max(0.0, duration_min) |
| if mode == "Transit": |
| if fare_hint is not None: |
| return float(fare_hint) |
| return TRANSIT_BASE + TRANSIT_PER_KM * max(0.0, distance_km) |
| return 0.0 |
|
|