module Changelogged.Settings where
import Prelude hiding (FilePath)
import Turtle
import qualified Control.Foldl as Fold
import Filesystem.Path.CurrentOS ((<.>), encodeString, decodeString)
import Data.Aeson.Types (typeMismatch)
import qualified Data.HashMap.Strict as HM
import Data.List (isInfixOf)
import Data.Text (Text)
import qualified Data.Yaml as Yaml
import Data.Vector ((!))
import Data.Yaml ((.:), (.:?))
import GHC.Generics
import Changelogged.Types
data Paths = Paths {
changelogs :: Maybe (HM.HashMap Text TaggedLog)
, versioned :: Maybe (HM.HashMap Text [TaggedFile])
} deriving (Show, Generic)
makeDefaultPaths :: IO Paths
makeDefaultPaths = do
cabals <- fold (find (suffix (text "package.yaml")) ".") Fold.list
let textualCabals = map encodeString cabals
filedCabals = map decodeString
taggedFiles = map (`TaggedFile` "version") (filedCabals $ filter (not . isInfixOf "/.") textualCabals)
defaultChLog = TaggedLog ("ChangeLog" <.> "md") Nothing
return $ Paths (Just $ HM.singleton "main" defaultChLog) (Just $ HM.singleton "main" taggedFiles)
instance Yaml.FromJSON Paths
instance Yaml.FromJSON TaggedFile where
parseJSON (Yaml.Object v) = TaggedFile
<$> v .: "path"
<*> v .: "variable"
parseJSON (Yaml.Array v) = TaggedFile
<$> Yaml.parseJSON (v ! 0)
<*> Yaml.parseJSON (v ! 1)
parseJSON invalid = typeMismatch "TaggedFile" invalid
instance Yaml.FromJSON TaggedLog where
parseJSON (Yaml.Object v) = TaggedLog
<$> v .: "path"
<*> v .:? "indicator"
parseJSON (Yaml.Array v) = TaggedLog
<$> Yaml.parseJSON (v ! 0)
<*> Yaml.parseJSON (v ! 1)
parseJSON invalid = typeMismatch "TaggedLog" invalid
instance Yaml.FromJSON FilePath where
parseJSON = fmap fromText . Yaml.parseJSON
loadPaths :: IO (Maybe Paths)
loadPaths = do
ms <- Yaml.decodeFileEither "./changelogged.yaml"
return $ case ms of
Left _wrong -> Nothing
Right paths -> Just paths