+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE DeriveGeneric #-}
+
+module Config where
+
+import GHC.Generics
+import Data.Aeson
+import Data.Aeson.Types
+import Data.Text hiding (map, init, length, splitAt, zip)
+import Data.Text.Lazy (toStrict)
+import Data.Aeson
+import Data.Aeson.TH
+import Data.Aeson.Text
+
+data GlobalConfig = GlobalConfig {
+ editor :: Text,
+ commitCommand :: Maybe Text,
+ gitRemote :: Maybe Text
+ } deriving (Show, Generic)
+
+data LocalConfig = LocalConfig {
+ name :: Text,
+ description :: Text,
+ theme :: Text,
+ editor :: Maybe Text,
+ commitCommand :: Maybe Text,
+ gitRemote :: Maybe Text
+ } deriving (Show, Generic)
+
+data ProjectConfig = ProjectConfig {
+ name :: Text,
+ description :: Text,
+ theme :: Text,
+ editor :: Text,
+ commitCommand :: Maybe Text,
+ gitRemote :: Maybe Text
+ } deriving (Show, Generic)
+
+instance ToJSON GlobalConfig where
+ toJSON = genericToJSON defaultOptions
+ { omitNothingFields = False }
+
+instance FromJSON GlobalConfig where
+ parseJSON = genericParseJSON defaultOptions
+ { omitNothingFields = False }
+
+instance ToJSON LocalConfig where
+ toJSON = genericToJSON defaultOptions
+ { omitNothingFields = True }
+
+instance FromJSON LocalConfig where
+ parseJSON = genericParseJSON defaultOptions
+ { omitNothingFields = True }
+
+maybeTrump :: LocalConfig -> GlobalConfig -> (LocalConfig -> Maybe a) -> (GlobalConfig -> Maybe a) -> Maybe a
+maybeTrump l g lf gf = case lf l of
+ Just x -> Just x
+ Nothing -> gf g
+
+trump :: LocalConfig -> GlobalConfig -> (LocalConfig -> Maybe a) -> (GlobalConfig -> a) -> a
+trump l g lf gf = case lf l of
+ Just x -> x
+ Nothing -> gf g
+
+getProjectConfig :: GlobalConfig -> LocalConfig -> ProjectConfig
+getProjectConfig g l = ProjectConfig
+ (name (l :: LocalConfig))
+ (description (l :: LocalConfig))
+ (theme (l :: LocalConfig))
+ (trumper editor editor)
+ (maybeTrumper commitCommand commitCommand)
+ (maybeTrumper gitRemote gitRemote)
+ where
+ trumper = trump l g
+ maybeTrumper = maybeTrump l g