all repos — kokyo @ main

Chatbot and CLI tool for Swiss public transports

api/locationInformationRequest.ts (view raw)

 1import { get } from "../lib/func.ts";
 2import { getLocationInformationRequest } from "./api.ts";
 3
 4export const findStops = async (
 5  input: string | Coordinates
 6): Promise<Stop[]> => {
 7  const textInput = typeof input === "string" ? input : undefined;
 8  const coordinates = isCoordinates(input) ? input : undefined;
 9  const { result } = await getLocationInformationRequest(
10    textInput,
11    coordinates
12  );
13  const placeResult = get<object[] | { Place: object }>(
14    result,
15    "OJP.OJPResponse.siri:ServiceDelivery.OJPLocationInformationDelivery.PlaceResult"
16  );
17  if (!placeResult) return [];
18  else if (Array.isArray(placeResult))
19    return placeResult.map(formatPlace).filter(uniqStopFilter);
20  else if (placeResult.Place) return [formatPlace(placeResult)];
21  else return [];
22};
23
24const isCoordinates = (input: string | Coordinates) =>
25  typeof input === "object" && "latitude" in input && "longitude" in input;
26
27const formatPlace = (item: object): Stop => ({
28  name: get(item, "Place.StopPlace.StopPlaceName.Text.#text"),
29  stopRef: get(item, "Place.StopPlace.StopPlaceRef"),
30  geoPosition: {
31    latitude: get(item, "Place.GeoPosition.siri:Latitude"),
32    longitude: get(item, "Place.GeoPosition.siri:Longitude"),
33  },
34});
35
36const uniqStopFilter = (stop: Stop, index: number, arr: Stop[]) => {
37  const itemIndex = arr.findIndex(s => s.stopRef === stop.stopRef);
38  return itemIndex === index;
39};