packages feed

dresdner-verkehrsbetriebe-0.1.1: src/Network/Transportation/Germany/DVB/Route/JSON.hs

-- |
-- Module: Network.Transportation.Germany.DVB.Route.JSON
-- Copyright: (C) 2015 Braden Walters
-- License: MIT (see LICENSE file)
-- Maintainer: Braden Walters <vc@braden-walters.info>
-- Stability: experimental
-- Portability: ghc

{-# LANGUAGE OverloadedStrings #-}

module Network.Transportation.Germany.DVB.Route.JSON
( Route(..)
, Trip(..)
, Leg(..)
, LegMode(..)
, Stop(..)
, StopRef(..)
) where

import Control.Applicative
import Control.Monad
import Data.Aeson
import qualified Data.Foldable as F
import qualified Data.HashMap.Strict as HMS

-- |Parsing JSON type for routes.
data Route = Route { routeTrips :: [Trip] }

instance FromJSON Route where
  parseJSON (Object obj) = Route <$>
                           obj .: "trips"
  parseJSON _ = mzero

-- |Parsing JSON type for trips.
data Trip = Trip
  { tripDuration :: String
  , tripLegs :: [Leg]
  }

instance FromJSON Trip where
  parseJSON (Object obj) = Trip <$>
                           obj .: "duration" <*>
                           obj .: "legs"
  parseJSON _ = mzero

-- |Parsing JSON type for trip legs.
data Leg = Leg
  { legMode :: LegMode
  , legStops :: [Stop]
  }

instance FromJSON Leg where
  parseJSON (Object obj) = Leg <$>
                           maybe mzero parseJSON (HMS.lookup "mode" obj) <*>
                           (F.concat <$> (obj .:? "stopSeq"))
  parseJSON _ = mzero

-- |Parsing JSON type for the mode object in trip legs.
data LegMode = LegMode
  { legModeNumber :: String
  , legModeDesc :: String
  }

instance FromJSON LegMode where
  parseJSON (Object obj) = LegMode <$>
                           obj .: "number" <*>
                           obj .: "desc"
  parseJSON _ = mzero

-- |Parsing JSON type for stops in trips.
data Stop = Stop
  { stopName :: String
  , stopPlatformName :: String
  , stopRef :: StopRef
  }

instance FromJSON Stop where
  parseJSON (Object obj) = Stop <$>
                           obj .: "nameWO" <*>
                           obj .: "platformName" <*>
                           maybe mzero parseJSON (HMS.lookup "ref" obj)
  parseJSON _ = mzero

-- |Parsing JSON type for the ref object in stops in trips.
data StopRef = StopRef
  { stopRefArrivalTime :: Maybe String
  , stopRefArrivalDelayMins :: Maybe String
  , stopRefDepartureTime :: Maybe String
  , stopRefDepartureDelayMins :: Maybe String
  }

instance FromJSON StopRef where
  parseJSON (Object obj) = StopRef <$>
                           obj .:? "arrDateTime" <*>
                           obj .:? "arrDelay" <*>
                           obj .:? "depDateTime" <*>
                           obj .:? "depDelay"
  parseJSON _ = mzero