module Issue ( Issue (..), Provenance (..), id, internalTags, ) where import Data.Binary (Binary) import Data.List (find) import Data.Text qualified as T import Data.Time.Clock (UTCTime (utctDay)) import GHC.Generics (Generic) import GHC.Records (HasField (..)) import Issue.Provenance (Author (..), Commit (..), Provenance (..)) import Issue.Tag (Tag (..)) import TreeGrepper.Match qualified as G import Prelude hiding (id) data Issue = Issue { title :: T.Text, description :: Maybe T.Text, file :: String, provenance :: Provenance, start :: G.Position, end :: G.Position, tags :: [Tag], markers :: [T.Text], rawText :: T.Text } deriving (Show, Binary, Generic, Eq) id :: Issue -> Maybe String id issue = (\(Tag _ v) -> T.unpack <$> v) =<< find (\(Tag k _) -> k == "id") (issue.tags ++ issue.internalTags) internalTags :: Issue -> [Tag] internalTags (Issue {..}) = concat [ [ Tag "id" $ Just $ toSpinalCase title, Tag "title" $ Just $ title, Tag "createdAt" $ Just $ T.pack $ show $ utctDay provenance.first.date, Tag "modifiedAt" $ Just $ T.pack $ show $ utctDay provenance.last.date, Tag "author" $ Just $ provenance.first.author.name, Tag "editor" $ Just $ provenance.last.author.name ], map (Tag "type" . Just) markers ] instance HasField "internalTags" Issue [Tag] where getField issue = internalTags issue toSpinalCase :: T.Text -> T.Text toSpinalCase = T.replace " " "-" . T.filter keep . T.toLower where keep = (`elem` (concat [[' ', '-'], ['a' .. 'z'], ['0' .. '9']]))