{- This file is part of vcs-web-hook-parse. - - Written in 2015 by fr33domlover . - - ♡ Copying is an act of love. Please copy, reuse and share. - - The author(s) have dedicated all copyright and related and neighboring - rights to this software to the public domain worldwide. This software is - distributed without any warranty. - - You should have received a copy of the CC0 Public Domain Dedication along - with this software. If not, see - . -} {-# LANGUAGE OverloadedStrings #-} 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 a JSON string (the body of the HTTP request) into event information. -- If parsing fails, return 'Left' an error message. parse :: B.ByteString -> Either String Push parse = eitherDecode