{-# LANGUAGE ApplicativeDo #-} {-# LANGUAGE BlockArguments #-} {-# LANGUAGE DeriveAnyClass #-} {-# LANGUAGE DerivingStrategies #-} {-# LANGUAGE DerivingVia #-} {-# LANGUAGE LambdaCase #-} module OwnTracks (Message(..), module OwnTracks.Location, module OwnTracks.Status, module OwnTracks.Configuration, module OwnTracks.Command, module OwnTracks.Waypoint ) where import Data.Aeson import Data.Aeson.Types (Parser) import Data.ByteString (ByteString) import Data.ByteString.Base64 import Data.Functor ((<&>)) import Data.Text (Text) import qualified Data.Text as T import Data.Text.Encoding (encodeUtf8) import Data.Time (UTCTime, defaultTimeLocale, parseTimeM) import Database.Persist import GHC.Generics (Generic) import OwnTracks.Command import OwnTracks.Configuration import OwnTracks.Location import OwnTracks.Status import OwnTracks.Waypoint data Message = MsgLocation Location | MsgStatus Status | MsgConfig Configuration | MsgWaypoints [Waypoint] deriving (Generic, Show, Eq) instance FromJSON Message where parseJSON v@(Object o) = do ty :: Text <- o .: "_type" case ty of "location" -> MsgLocation <$> parseJSON v "status" -> MsgStatus <$> parseJSON v "configuration" -> MsgConfig <$> parseJSON v "waypoints" -> MsgWaypoints <$> o .: "waypoints" _ -> fail "unknown _type of owntracks message."