module Cuk.Issue
( runIssue
, mkIssueId
, getIssueTitle
) where
import GitHub (Error, Id, Issue (..), IssueState (..), getUrl, mkId)
import GitHub.Data.Options (stateOpen)
import GitHub.Endpoints.Issues (issue, issuesForRepo)
import Cuk.ColorTerminal (arrow, blueCode, errorMessage, redCode, resetCode)
import qualified Data.Text as T
runIssue :: Maybe Int -> IO ()
runIssue = \case
Just num -> getIssue $ mkIssueId num
Nothing -> getAllIssues
getAllIssues :: IO ()
getAllIssues = issuesForRepo "siapbantu" "git-cuk" stateOpen >>= \case
Left err -> errorMessage $ show err
Right is -> for_ is (putTextLn . showIssueName blueCode)
getIssue :: Id Issue -> IO ()
getIssue num = fetchIssue num >>= \case
Left err -> errorMessage $ show err
Right is -> putTextLn $ showIssueFull is
showIssueName :: Text -> Issue -> Text
showIssueName colorCode Issue{..} =
arrow <> colorCode <> "[#" <> show @Text issueNumber <> "] " <> resetCode <> issueTitle
showIssueFull :: Issue -> Text
showIssueFull i@Issue{..} = T.intercalate "\n" $
showIssueName (statusToCode issueState) i
: [ " URL: " <> getUrl url | Just url <- [issueHtmlUrl]]
++ [ " " <> desc | Just (T.strip -> desc) <- [issueBody], desc /= ""]
where
statusToCode :: IssueState -> Text
statusToCode = \case
StateOpen -> blueCode
StateClosed -> redCode
mkIssueId :: Int -> Id Issue
mkIssueId = mkId $ Proxy @Issue
fetchIssue :: Id Issue -> IO (Either Error Issue)
fetchIssue = issue "siapbantu" "git-cuk"
getIssueTitle :: Id Issue -> IO Text
getIssueTitle num = fetchIssue num >>= \case
Left err -> errorMessage (show err) >> exitFailure
Right Issue{..} -> pure issueTitle