{-# OPTIONS_GHC -fno-warn-orphans #-}
module Xrefcheck.Config where
import Data.Aeson.Options (defaultOptions)
import Data.Aeson.TH (deriveFromJSON)
import Data.Yaml (FromJSON (..), decodeEither', prettyPrintParseException, withText)
import Instances.TH.Lift ()
import qualified Language.Haskell.TH.Syntax as TH
import System.FilePath ((</>))
import TH.RelativePaths (qReadFileBS)
import Time (KnownRatName, Second, Time, unitsP)
import Xrefcheck.System (RelGlobPattern)
data Config = Config
{ cTraversal :: TraversalConfig
, cVerification :: VerifyConfig
}
data TraversalConfig = TraversalConfig
{ tcIgnored :: [FilePath]
}
data VerifyConfig = VerifyConfig
{ vcAnchorSimilarityThreshold :: Double
, vcExternalRefCheckTimeout :: Time Second
, vcVirtualFiles :: [RelGlobPattern]
, vcNotScanned :: [FilePath]
}
defConfigText :: ByteString
defConfigText =
$(TH.lift =<< qReadFileBS ("src-files" </> "def-config.yaml"))
defConfig :: HasCallStack => Config
defConfig =
either (error . toText . prettyPrintParseException) id $
decodeEither' defConfigText
deriveFromJSON defaultOptions ''Config
deriveFromJSON defaultOptions ''TraversalConfig
deriveFromJSON defaultOptions ''VerifyConfig
instance KnownRatName unit => FromJSON (Time unit) where
parseJSON = withText "time" $
maybe (fail "Unknown time") pure . unitsP . toString