aboutsummaryrefslogtreecommitdiff
path: root/lib/OwnTracks.hs
blob: 25b0ae9b618c7574ea60d1671fbc386bfeb0b582 (plain)
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
{-# LANGUAGE BlockArguments     #-}
{-# LANGUAGE DeriveAnyClass     #-}
{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE DerivingVia        #-}
{-# LANGUAGE LambdaCase         #-}
{-# LANGUAGE ApplicativeDo         #-}


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.Location
import           OwnTracks.Status
import           OwnTracks.Configuration
import           OwnTracks.Command
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."