aboutsummaryrefslogtreecommitdiff
path: root/lib/OwnTracks.hs
blob: c39a3bc6d85d9a06d353a6cd39f4b1447b407364 (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
{-# 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."