ctucx.git: nimhafas

[nimlang] hafas-client library

1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
31 
32 
33 
34 
35 
36 
37 
38 
39 
40 
41 
42 
43 
44 
45 
46 
47 
48 
49 
50 
51 
52 
53 
54 
55 
56 
57 
58 
59 
60 
61 
62 
63 
64 
65 
66 
67 
import ../types
import ./stopover
import ./msg
import ./date
import ./line
import json
import options

proc parseLegPart(common: CommonData, lp: JsonNode): LegPart =
  let h                    = lp.to(HafasStopParams)
  let plannedDepartureTime = parseDate(common, h.dTimeS, h.dTZOffset)
  let plannedArrivalTime   = parseDate(common, h.aTimeS, h.aTZOffset)

  if h.dPlatfS.isSome: result.plannedPlatform     = h.dPlatfS
  elif h.aPlatfS.isSome: result.plannedPlatform   = h.aPlatfS
  if h.dPlatfR.isSome: result.prognosedPlatform   = h.dPlatfR
  elif h.aPlatfR.isSome: result.prognosedPlatform = h.aPlatfR
  if h.dTimeR.isSome: result.prognosedTime        = parseDate(common, h.dTimeR, h.dTZOffset)
  elif h.aTimeR.isSome: result.prognosedTime      = parseDate(common, h.aTimeR, h.aTZOffset)

  if plannedDepartureTime.isSome: result.plannedTime = plannedDepartureTime.get
  elif plannedArrivalTime.isSome: result.plannedTime = plannedArrivalTime.get
  else: raise newException(CatchableError, "missing departure and arrival time for leg")

  result.point = common.points[h.locX.get]

proc mkParseLeg*(common: CommonData): proc =
  proc parseLeg(l: JsonNode): Leg =

    if l{"jny"}{"polyG"}{"polyXL"}.getElems().len() > 0:
      result.polyline = some(Polyline(
        type: "FeatureCollection",
      ))
      for n in l{"jny"}{"polyG"}{"polyXL"}.getElems():
        result.polyline.get.features &= common.polylines[n.getInt()].features

    let typeStr = l{"type"}.getStr()
    if typeStr == "JNY":
      result.direction = some(l{"jny"}{"dirTxt"}.getStr())
      result.tripId = some(l{"jny"}{"jid"}.getStr())
      result.line = common.parseLine(l["jny"]["prodX"].getInt())

      let stopovers = l{"jny"}{"stopL"}.getElems()
      if stopovers.len > 0:
        result.stopovers = some(stopovers.map(mkParseStopover(common)))

      let remarks = l{"jny"}{"msgL"}.getElems()
      if remarks.len > 0:
        result.remarks = some(remarks.map(mkParseMsg(common)))

    elif typeStr == "WALK":
      result.isWalking = true
      result.distance = some(l{"gis"}{"dist"}.getInt())

    elif typeStr == "TRSF" or typeStr == "DEVI":
      result.isTransfer = true

    else:
      raise newException(CatchableError, "Unimplemented hafas leg type: " & typeStr)

    result.departure = common.parseLegPart(l{"dep"})
    result.arrival = common.parseLegPart(l{"arr"})

    result.cancelled = l{"dep"}{"dCncl"}.getBool(false) or l{"arr"}{"aCncl"}.getBool(false)

  return parseLeg