packages feed

tasklite-core-0.3.0.0: source/TaskToTag.hs

module TaskToTag where

import Protolude as P (
  Eq,
  Generic,
  Show,
  Text,
  decodeUtf8,
  (.),
  (<$>),
  (<*>),
 )

import Data.Generics (Data)
import Data.Text as T (dropEnd)
import Data.Yaml as Yaml (ToJSON, encode)
import Database.SQLite.Simple (FromRow, ToRow, field, fromRow, toRow)
import Database.SQLite.Simple.ToField (toField)
import Prettyprinter (Pretty (pretty))


-- | Record for storing entries of the `task_to_tag` table
data TaskToTag = TaskToTag
  { ulid :: Text -- Ulid
  , task_ulid :: Text
  , tag :: Text
  }
  deriving (Show, Eq, Generic, Data)


instance FromRow TaskToTag where
  fromRow =
    TaskToTag
      <$> field
      <*> field
      <*> field


instance ToRow TaskToTag where
  toRow TaskToTag{..} =
    [ toField ulid
    , toField task_ulid
    , toField tag
    ]


instance ToJSON TaskToTag


instance Pretty TaskToTag where
  pretty =
    pretty
      . T.dropEnd 1 -- Drop trailing newline to maybe add it later
      . decodeUtf8
      . Yaml.encode