module Types ( Note(..)
, NoteId
, NoteSignature(..)
, noteIdToText
, ApplicationResult(..)
, Verbosity(..)
) where
import Data.Aeson
import Data.Aeson.Types
import Data.Text (Text)
import Data.Time.Clock (UTCTime)
import Data.Time.Format
import Database.SQLite.Simple
import Database.SQLite.Simple.FromField
import Database.SQLite.Simple.ToField
-- * NoteId
newtype NoteId = NoteId Text
deriving (Eq, Ord, FromField, FromJSON, ToField)
noteIdToText :: NoteId -> Text
noteIdToText (NoteId t) = t
-- * Note
data Note = Note { note_id :: NoteId
, note_title :: Text
, note_text :: Text
, note_hash :: Text
, note_created :: Text
, note_updated :: Text
}
instance ToRow Note where
toRow (Note n_id n_title n_text n_hash n_created n_updated) =
toRow (n_id, n_title, n_text, n_hash, n_created, n_updated)
instance FromJSON Note where
parseJSON (Object o) = Note <$>
o .: "id" <*>
o .: "title" <*>
o .: "text" <*>
o .: "hash" <*>
o .: "created_at" <*>
o .: "updated_at"
parseJSON other = typeMismatch "Note" other
-- * NoteSignature
data NoteSignature = NoteSignature { ns_id :: NoteId
, ns_updated :: UTCTime
}
instance FromJSON NoteSignature where
parseJSON (Object o) = NoteSignature <$>
o .: "id" <*>
(o .: "updated_at" >>= timeFromString)
where timeFromString = parseTimeM False defaultTimeLocale "%Y-%m-%d %H:%M:%S"
parseJSON other = typeMismatch "NoteSignature" other
-- * ApplicationResult
-- | Structure describing how many notes were updated, newly added, deleted, and already up to date,
-- respectively.
data ApplicationResult = ApplicationResult Int Int Int Int
-- * Verbosity
data Verbosity = Verbose | Standard
deriving (Eq)