35 lines
916 B
Haskell
35 lines
916 B
Haskell
|
module Actions where
|
||
|
|
||
|
import Data.Aeson
|
||
|
import Data.Aeson.Types
|
||
|
import Network.HTTP.Req
|
||
|
import Request
|
||
|
import Types
|
||
|
import Prelude hiding (get)
|
||
|
|
||
|
listReposUrl :: Source -> URL
|
||
|
listReposUrl (Source Github user) = apiUrl Github /: "users" /~ user /: "repos"
|
||
|
listReposUrl _ = error "not implemented"
|
||
|
|
||
|
parseListRepos :: Source -> Value -> Either Error [Repo]
|
||
|
parseListRepos src@(Source forge _) = (bimap ParseError (sourceRepo src <$>)) <$> parseEither parser
|
||
|
where
|
||
|
parser = case forge of
|
||
|
Github ->
|
||
|
withArray
|
||
|
"Repos"
|
||
|
(mapM (withObject "Repo" (.: "name")) . toList)
|
||
|
_ -> error "not implemented"
|
||
|
|
||
|
listRepos :: Source -> Action [Repo]
|
||
|
listRepos src = do
|
||
|
let url = listReposUrl src
|
||
|
result <- get url
|
||
|
pure (parseListRepos src =<< result)
|
||
|
|
||
|
checkRepoExists :: Repo -> Request Bool
|
||
|
checkRepoExists repo = do
|
||
|
let url = repoUrl repo
|
||
|
result <- get url
|
||
|
pure (isRight result)
|