packages feed

gli-0.0.1: src/Gli/Types.hs

{-# LANGUAGE DeriveGeneric         #-}
{-# LANGUAGE DuplicateRecordFields #-}

module Gli.Types where

import           Data.Aeson
import qualified Data.ByteString.Char8 as B
import           Data.Map.Strict       as M
import qualified Data.Text             as T
import           Data.Time
import           GHC.Generics          (Generic)

data Setup =
  Setup { keyFile :: String } deriving (Show)

data Commands = CmdSetup Setup
              | CmdPrs
              deriving (Show)

data Project =
  Project { id              :: Int
          , description     :: Maybe T.Text
          , name            :: T.Text
          , ssh_url_to_repo :: T.Text
          } deriving (Generic)

instance Show Project where
   show (Project pid pdescription pname purl) =
       unlines [ "GitLab Project"
               , "Id:         " ++ show pid
               , "Name:       " ++ show pname
               , "Descripion: " ++ justOrEmpty pdescription
               , "Git Url:    " ++ show purl
               , ""
               ]

data MergeRequest = MergeRequest { id                        :: Int
                                 , title                     :: Maybe T.Text
                                 , iid                       :: Int
                                 , project_id                :: Int
                                 , description               :: Maybe T.Text
                                 , source_branch             :: T.Text
                                 , upvotes                   :: Int
                                 , downvotes                 :: Int
                                 , author                    :: User
                                 , assignee                  :: Maybe User
                                 , source_project_id         :: Int
                                 , target_project_id         :: Int
                                 , labels                    :: [Maybe T.Text]
                                 , work_in_progress          :: Bool
                                 , milestone                 :: Maybe T.Text
                                 , merge_when_build_succeeds :: Bool
                                 , merge_status              :: T.Text
                                 , subscribed                :: Maybe Bool
                                 , web_url                   :: T.Text
                                 , sha                       :: T.Text
                                 , created_at                :: UTCTime
                                 , updated_at                :: UTCTime
                                 } deriving (Generic)

instance Show MergeRequest where
   show (MergeRequest mid mtitle _ _ mdescription msource_branch
         _ _ mauthor massignee _
         _ _ mwork_in_progress _
         _ mmerge_status _ mweb_url _ mcreated mupdated) =
     unlines [ "ID:         " ++  show mid
             , "URL:        " ++  show mweb_url
             , "Title:      " ++  justOrEmpty mtitle
             , "Descripion: " ++  justOrEmpty mdescription
             , "Author:     " ++  show mauthor
             , "Assignee:   " ++  justOrEmpty massignee
             , "WIP:        " ++  show mwork_in_progress
             , "Status:     " ++  show mmerge_status
             , "Branch:     " ++  show msource_branch
             ]

data User = User { name     :: T.Text
                 , username :: T.Text
                 } deriving (Generic)

instance Show User where
   show (User _ uusername) = show uusername

data GliCfg = GliCfg { accounts :: Account
                     } deriving (Generic, Show)

newtype Account = Account (Map T.Text AccountConfig)
                deriving (Generic, Show)

data AccountConfig = AccountConfig { key :: String
                                   , url :: String
                                   } deriving (Generic, Show)

type GitlabAccountConfig = (String, B.ByteString)

data GitUrl = GitUrl { domain :: T.Text
                     , repo   :: T.Text
                     }

data LocalYmlContent = LocalYmlContent { masterFileConfig :: MasterFileConfig
                                       , project          :: Project
                                       } deriving (Generic, Show)

data MasterFileConfig = MasterFileConfig { file :: FilePath
                                         , key  :: T.Text
                                         }
                         deriving (Generic, Show)

instance Show GitUrl where
   show (GitUrl gdomain grepo) =
       unlines [ "Git Project Found"
               , "Domain:     " ++ show gdomain
               , "Repo:       " ++ show grepo
               ]

instance ToJSON MergeRequest  where
  toEncoding = genericToEncoding defaultOptions
instance ToJSON User  where
  toEncoding = genericToEncoding defaultOptions
instance ToJSON Project where
  toEncoding = genericToEncoding defaultOptions
instance ToJSON Account where
  toEncoding = genericToEncoding defaultOptions
instance ToJSON AccountConfig where
  toEncoding = genericToEncoding defaultOptions
instance ToJSON LocalYmlContent where
  toEncoding = genericToEncoding defaultOptions
instance ToJSON MasterFileConfig where
  toEncoding = genericToEncoding defaultOptions

instance FromJSON MergeRequest
instance FromJSON User
instance FromJSON GliCfg
instance FromJSON Account
instance FromJSON AccountConfig
instance FromJSON Project
instance FromJSON LocalYmlContent
instance FromJSON MasterFileConfig


justOrEmpty :: Show a => Maybe a -> String
justOrEmpty (Just a)  = show a
justOrEmpty Nothing = ""

localYmlFile :: FilePath
localYmlFile = "gli.yml"

gitInfoExcludeFile :: FilePath
gitInfoExcludeFile = ".git/info/exclude"