toodles-1.1.0: src/Types.hs
{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE OverloadedStrings #-}
module Types where
import License
import Data.Aeson (FromJSON, ToJSON, Value (String), parseJSON,
toJSON)
import Data.Aeson.Types (typeMismatch)
import Data.Data
import Data.IORef (IORef)
import Data.String (IsString)
import Data.Text (Text)
import qualified Data.Text as T (unpack)
import GHC.Generics (Generic)
data SourceFile = SourceFile
{ fullPath :: FilePath
, sourceLines :: [Text]
} deriving (Show)
type LineNumber = Integer
data ToodlesState = ToodlesState
{ results :: IORef (Maybe TodoListResult),
dataPath :: FilePath,
userTier :: IORef UserTier
}
data CommentType = SingleLine | MultiLine deriving (Show, Eq, Generic)
instance ToJSON CommentType
data TodoEntry
= TodoEntryHead { entryId :: Integer
, body :: [Text]
, assignee :: Maybe Text
, sourceFile :: FilePath
, lineNumber :: LineNumber
, priority :: Maybe Integer
, flag :: Flag
, customAttributes :: [(Text, Text)]
, tags :: [Text]
, leadingText :: Text
, commentType :: CommentType
, entryHeadOpened :: Bool
, entryHeadClosed :: Bool
}
| TodoBodyLine
Text -- the body
Bool -- has opening tag
Bool -- has closing tag
| TodoBodyLineCombined
[Text] -- the body
Bool -- has opening tag
Bool -- has closing tag
deriving (Show, Generic)
instance ToJSON TodoEntry
data TodoListResult = TodoListResult
{ todos :: [TodoEntry]
, limited :: Bool
} deriving (Show, Generic)
instance ToJSON TodoListResult
newtype DeleteTodoRequest = DeleteTodoRequest
{ ids :: [Integer]
} deriving (Show, Generic)
instance FromJSON DeleteTodoRequest
data EditTodoRequest = EditTodoRequest
{ editIds :: [Integer]
, setAssignee :: Maybe Text
, addTags :: [Text]
, addKeyVals :: [(Text, Text)]
, setPriority :: Maybe Integer
} deriving (Show, Generic)
instance FromJSON EditTodoRequest
data GetLicenseResponse = GetLicenseResponse
{ toodlesTier:: UserTier
} deriving (Show, Generic)
instance ToJSON GetLicenseResponse
data Flag = TODO | FIXME | XXX | UF UserFlag
deriving (Generic)
newtype UserFlag = UserFlag Text
deriving (Show, Eq, IsString, Data, Generic)
instance Show Flag where
show TODO = "TODO"
show FIXME = "FIXME"
show XXX = "XXX"
show (UF (UserFlag x)) = T.unpack x
instance ToJSON Flag where
toJSON TODO = Data.Aeson.String "TODO"
toJSON FIXME = Data.Aeson.String "FIXME"
toJSON XXX = Data.Aeson.String "XXX"
toJSON (UF (UserFlag x)) = Data.Aeson.String x
instance FromJSON Flag where
parseJSON (Data.Aeson.String x) =
case x of
"TODO" -> pure TODO
"FIXME" -> pure FIXME
"XXX" -> pure XXX
_ -> pure $ UF $ UserFlag x
parseJSON invalid = typeMismatch "UserFlag" invalid
instance ToJSON UserFlag where
toJSON (UserFlag x) = Data.Aeson.String x
instance FromJSON UserFlag where
parseJSON (Data.Aeson.String x) = pure $ UserFlag x
parseJSON invalid = typeMismatch "UserFlag" invalid