module Web.Hook.Gogs
( CommitID
, Url
, User (..)
, Commit (..)
, Repository (..)
, Push (..)
, parse
)
where
import Control.Applicative
import Control.Monad (mzero)
import Data.Aeson
import qualified Data.ByteString.Lazy as B
import qualified Data.Text as T
type CommitID = T.Text
type Url = T.Text
data User = User
{ userName :: T.Text
, userEmail :: T.Text
, userUsername :: T.Text
}
deriving Show
data Commit = Commit
{ commitId :: CommitID
, commitMessage :: T.Text
, commitUrl :: Url
, commitAuthor :: User
}
deriving Show
data Repository = Repository
{ repoId :: Int
, repoName :: T.Text
, repoUrl :: Url
, repoDescription :: T.Text
, repoWebsite :: Url
, repoWatchers :: Int
, repoOwner :: User
, repoPrivate :: Bool
}
deriving Show
data Push = Push
{ pushSecret :: T.Text
, pushRef :: T.Text
, pushCommits :: [Commit]
, pushRepository :: Repository
, pushPusher :: User
, pushBefore :: CommitID
, pushAfter :: CommitID
, pushCompareUrl :: Url
}
deriving Show
instance FromJSON User where
parseJSON (Object v) =
User <$>
v .: "name" <*>
v .: "email" <*>
v .: "username"
parseJSON _ = mzero
instance FromJSON Commit where
parseJSON (Object v) =
Commit <$>
v .: "id" <*>
v .: "message" <*>
v .: "url" <*>
v .: "author"
parseJSON _ = mzero
instance FromJSON Repository where
parseJSON (Object v) =
Repository <$>
v .: "id" <*>
v .: "name" <*>
v .: "url" <*>
v .: "description" <*>
v .: "website" <*>
v .: "watchers" <*>
v .: "owner" <*>
v .: "private"
parseJSON _ = mzero
instance FromJSON Push where
parseJSON (Object v) =
Push <$>
v .: "secret" <*>
v .: "ref" <*>
v .: "commits" <*>
v .: "repository" <*>
v .: "pusher" <*>
v .: "before" <*>
v .: "after" <*>
v .: "compare_url"
parseJSON _ = mzero
parse :: B.ByteString -> Either String Push
parse = eitherDecode