-----------------------------------------------------------------------------
-- |
-- License     :  BSD-3-Clause
-- Maintainer  :  Oleg Grenrus <oleg.grenrus@iki.fi>
--
-- The underlying git references on a Github repo, exposed for the world to
-- see. The git internals documentation will also prove handy for understanding
-- these. API documentation at <http://developer.github.com/v3/git/refs/>.
module GitHub.Endpoints.GitData.References (
    reference,
    reference',
    referenceR,
    references,
    references',
    referencesR,
    createReference,
    createReferenceR,
    namespacedReferences,
    module GitHub.Data,
    ) where

import GitHub.Data
import GitHub.Internal.Prelude
import GitHub.Request
import Prelude ()

-- | A single reference by the ref name.
--
-- > reference' (Just $ BasicAuth "github-username" "github-password") "mike-burns" "github" "heads/master"
reference' :: Maybe Auth -> Name Owner -> Name Repo -> Name GitReference -> IO (Either Error GitReference)
reference' :: Maybe Auth
-> Name Owner
-> Name Repo
-> Name GitReference
-> IO (Either Error GitReference)
reference' auth :: Maybe Auth
auth user :: Name Owner
user repo :: Name Repo
repo ref :: Name GitReference
ref =
    Maybe Auth
-> GenRequest 'MtJSON 'RO GitReference
-> IO (Either Error GitReference)
forall am (mt :: MediaType *) a.
(AuthMethod am, ParseResponse mt a) =>
Maybe am -> GenRequest mt 'RO a -> IO (Either Error a)
executeRequestMaybe Maybe Auth
auth (GenRequest 'MtJSON 'RO GitReference
 -> IO (Either Error GitReference))
-> GenRequest 'MtJSON 'RO GitReference
-> IO (Either Error GitReference)
forall a b. (a -> b) -> a -> b
$ Name Owner
-> Name Repo
-> Name GitReference
-> GenRequest 'MtJSON 'RO GitReference
forall (k :: RW).
Name Owner
-> Name Repo -> Name GitReference -> Request k GitReference
referenceR Name Owner
user Name Repo
repo Name GitReference
ref

-- | A single reference by the ref name.
--
-- > reference "mike-burns" "github" "heads/master"
reference :: Name Owner -> Name Repo -> Name GitReference -> IO (Either Error GitReference)
reference :: Name Owner
-> Name Repo -> Name GitReference -> IO (Either Error GitReference)
reference = Maybe Auth
-> Name Owner
-> Name Repo
-> Name GitReference
-> IO (Either Error GitReference)
reference' Maybe Auth
forall a. Maybe a
Nothing

-- | Query a reference.
-- See <https://developer.github.com/v3/git/refs/#get-a-reference>
referenceR :: Name Owner -> Name Repo -> Name GitReference -> Request k GitReference
referenceR :: Name Owner
-> Name Repo -> Name GitReference -> Request k GitReference
referenceR user :: Name Owner
user repo :: Name Repo
repo ref :: Name GitReference
ref =
    Paths -> QueryString -> Request k GitReference
forall (mt :: RW) a. Paths -> QueryString -> Request mt a
query ["repos", Name Owner -> Text
forall a. IsPathPart a => a -> Text
toPathPart Name Owner
user, Name Repo -> Text
forall a. IsPathPart a => a -> Text
toPathPart Name Repo
repo, "git", "refs", Name GitReference -> Text
forall a. IsPathPart a => a -> Text
toPathPart Name GitReference
ref] []

-- | The history of references for a repo.
--
-- > references "mike-burns" "github"
references' :: Maybe Auth -> Name Owner -> Name Repo -> IO (Either Error (Vector GitReference))
references' :: Maybe Auth
-> Name Owner
-> Name Repo
-> IO (Either Error (Vector GitReference))
references' auth :: Maybe Auth
auth user :: Name Owner
user repo :: Name Repo
repo =
    Maybe Auth
-> GenRequest 'MtJSON 'RO (Vector GitReference)
-> IO (Either Error (Vector GitReference))
forall am (mt :: MediaType *) a.
(AuthMethod am, ParseResponse mt a) =>
Maybe am -> GenRequest mt 'RO a -> IO (Either Error a)
executeRequestMaybe Maybe Auth
auth (GenRequest 'MtJSON 'RO (Vector GitReference)
 -> IO (Either Error (Vector GitReference)))
-> GenRequest 'MtJSON 'RO (Vector GitReference)
-> IO (Either Error (Vector GitReference))
forall a b. (a -> b) -> a -> b
$ Name Owner
-> Name Repo
-> FetchCount
-> GenRequest 'MtJSON 'RO (Vector GitReference)
forall (k :: RW).
Name Owner
-> Name Repo -> FetchCount -> Request k (Vector GitReference)
referencesR Name Owner
user Name Repo
repo FetchCount
FetchAll

-- | The history of references for a repo.
--
-- > references "mike-burns" "github"
references :: Name Owner -> Name Repo -> IO (Either Error (Vector GitReference))
references :: Name Owner -> Name Repo -> IO (Either Error (Vector GitReference))
references = Maybe Auth
-> Name Owner
-> Name Repo
-> IO (Either Error (Vector GitReference))
references' Maybe Auth
forall a. Maybe a
Nothing

-- | Query all References.
-- See <https://developer.github.com/v3/git/refs/#get-all-references>
referencesR :: Name Owner -> Name Repo -> FetchCount -> Request k (Vector GitReference)
referencesR :: Name Owner
-> Name Repo -> FetchCount -> Request k (Vector GitReference)
referencesR user :: Name Owner
user repo :: Name Repo
repo =
    Paths
-> QueryString -> FetchCount -> Request k (Vector GitReference)
forall a (mt :: RW).
FromJSON a =>
Paths -> QueryString -> FetchCount -> Request mt (Vector a)
pagedQuery ["repos", Name Owner -> Text
forall a. IsPathPart a => a -> Text
toPathPart Name Owner
user, Name Repo -> Text
forall a. IsPathPart a => a -> Text
toPathPart Name Repo
repo, "git", "refs"] []

-- | Create a reference.
createReference :: Auth -> Name Owner -> Name Repo -> NewGitReference -> IO (Either Error GitReference)
createReference :: Auth
-> Name Owner
-> Name Repo
-> NewGitReference
-> IO (Either Error GitReference)
createReference auth :: Auth
auth user :: Name Owner
user repo :: Name Repo
repo newRef :: NewGitReference
newRef =
    Auth
-> GenRequest 'MtJSON 'RW GitReference
-> IO (Either Error GitReference)
forall am (mt :: MediaType *) a (rw :: RW).
(AuthMethod am, ParseResponse mt a) =>
am -> GenRequest mt rw a -> IO (Either Error a)
executeRequest Auth
auth (GenRequest 'MtJSON 'RW GitReference
 -> IO (Either Error GitReference))
-> GenRequest 'MtJSON 'RW GitReference
-> IO (Either Error GitReference)
forall a b. (a -> b) -> a -> b
$ Name Owner
-> Name Repo
-> NewGitReference
-> GenRequest 'MtJSON 'RW GitReference
createReferenceR Name Owner
user Name Repo
repo NewGitReference
newRef

-- | Create a reference.
-- See <https://developer.github.com/v3/git/refs/#create-a-reference>
createReferenceR :: Name Owner -> Name Repo -> NewGitReference -> Request 'RW GitReference
createReferenceR :: Name Owner
-> Name Repo
-> NewGitReference
-> GenRequest 'MtJSON 'RW GitReference
createReferenceR user :: Name Owner
user repo :: Name Repo
repo newRef :: NewGitReference
newRef =
     CommandMethod
-> Paths -> ByteString -> GenRequest 'MtJSON 'RW GitReference
forall a. CommandMethod -> Paths -> ByteString -> Request 'RW a
command CommandMethod
Post  ["repos", Name Owner -> Text
forall a. IsPathPart a => a -> Text
toPathPart Name Owner
user, Name Repo -> Text
forall a. IsPathPart a => a -> Text
toPathPart Name Repo
repo , "git", "refs"] (NewGitReference -> ByteString
forall a. ToJSON a => a -> ByteString
encode NewGitReference
newRef)

-- | Limited references by a namespace.
--
-- > namespacedReferences "thoughtbot" "paperclip" "tags"
namespacedReferences :: Name Owner -> Name Repo -> Text -> IO (Either Error [GitReference])
namespacedReferences :: Name Owner -> Name Repo -> Text -> IO (Either Error [GitReference])
namespacedReferences user :: Name Owner
user repo :: Name Repo
repo namespace :: Text
namespace =
    GenRequest 'MtJSON 'RO [GitReference]
-> IO (Either Error [GitReference])
forall (mt :: MediaType *) a.
ParseResponse mt a =>
GenRequest mt 'RO a -> IO (Either Error a)
executeRequest' (GenRequest 'MtJSON 'RO [GitReference]
 -> IO (Either Error [GitReference]))
-> GenRequest 'MtJSON 'RO [GitReference]
-> IO (Either Error [GitReference])
forall a b. (a -> b) -> a -> b
$ Name Owner
-> Name Repo -> Text -> GenRequest 'MtJSON 'RO [GitReference]
forall (k :: RW).
Name Owner -> Name Repo -> Text -> Request k [GitReference]
namespacedReferencesR Name Owner
user Name Repo
repo Text
namespace

-- | Query namespaced references.
-- See <https://developer.github.com/v3/git/refs/#get-all-references>
namespacedReferencesR :: Name Owner -> Name Repo -> Text -> Request k [GitReference]
namespacedReferencesR :: Name Owner -> Name Repo -> Text -> Request k [GitReference]
namespacedReferencesR user :: Name Owner
user repo :: Name Repo
repo namespace :: Text
namespace =
    Paths -> QueryString -> Request k [GitReference]
forall (mt :: RW) a. Paths -> QueryString -> Request mt a
query ["repos", Name Owner -> Text
forall a. IsPathPart a => a -> Text
toPathPart Name Owner
user, Name Repo -> Text
forall a. IsPathPart a => a -> Text
toPathPart Name Repo
repo, "git", "refs", Text
namespace] []