{-# LANGUAGE DeriveGeneric, FlexibleInstances #-} {- | Main types for debug-me - - Note that changing types in ways that change the JSON serialization - changes debug-me's wire format. -} module Types ( module Types, Val(..) ) where import Val import GHC.Generics (Generic) import Data.Aeson -- | Things that the developer sees. data Seen = Seen { seenData :: Val } deriving (Show, Generic) instance ToJSON Seen instance FromJSON Seen -- | Things that the developer enters. data Entered = Entered { enteredData :: Val , echoData :: Val -- ^ Data that is expected to be Seen, but has not been received -- at the time this was entered. } deriving (Show, Generic) instance ToJSON Entered instance FromJSON Entered -- | High level protocol. data Proto a = Proto a -- ^ either Entered or Seen | Rejected (Activity Entered) -- ^ sent by user to indicate when an Entered value was rejected. deriving (Show, Generic) instance ToJSON (Proto Seen) instance FromJSON (Proto Seen) instance ToJSON (Proto Entered) instance FromJSON (Proto Entered) -- | A Proto activity (either Entered or Seen) with a pointer -- to the Activity before this one. -- -- The Signature is over both the data in the activity, and its pointer. data Activity a = Activity { activity :: Proto a , prevActivity :: (Maybe Hash) , signature :: Signature } deriving (Show, Generic) instance ToJSON (Activity Seen) instance FromJSON (Activity Seen) instance ToJSON (Activity Entered) instance FromJSON (Activity Entered) -- | A log of Activity both Entered and Seen, which can be recorded to -- prove what happened in a debug-me session. data ActivityLog = ActivitySeen { activitySeen :: (Activity Seen, Hash) } | ActivityEntered { activityEntered :: (Activity Entered, Hash) } deriving (Show, Generic) instance ToJSON (ActivityLog) instance FromJSON (ActivityLog) newtype Signature = Signature Val deriving (Show, Generic) instance ToJSON Signature instance FromJSON Signature data Hash = Hash { hashMethod :: HashMethod , hashValue :: Val } deriving (Show, Generic, Eq) instance ToJSON Hash instance FromJSON Hash -- | We use SHA256. (SHA3 is included to future proof, and because it -- improves the generated JSON.) data HashMethod = SHA256 | SHA3 deriving (Show, Generic, Eq) instance ToJSON HashMethod instance FromJSON HashMethod