{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TupleSections #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}

module Ecluse.Config.Aeson () where

import Data.Aeson (FromJSON (..), Value (..), withObject, withText, (.!=), (.:), (.:?))
import Data.Aeson.Key qualified as Key
import Data.Aeson.KeyMap qualified as KeyMap
import Data.Aeson.Types (Parser)
import Data.IP (IPRange)
import Data.Map.Strict qualified as Map
import Data.Text qualified as T
import Data.Time (NominalDiffTime)

import Ecluse.Config.Parser
import Ecluse.Config.Rule
import Ecluse.Config.Types

import Ecluse.Core.Credential (Secret, mkSecret)
import Ecluse.Core.Ecosystem (Ecosystem, parseEcosystem)
import Ecluse.Core.Package (Scope, mkScope)
import Ecluse.Core.Package.Integrity (parseMinIntegrity, parseMinTrustedIntegrity)
import Ecluse.Core.Security (parseBlockedRange)
import Ecluse.Log (parseLogFormat)
import Ecluse.Telemetry (parseTelemetrySwitch)

instance FromJSON MountConfig where
    parseJSON :: Value -> Parser MountConfig
parseJSON = String
-> (KeyMap Value -> Parser MountConfig)
-> Value
-> Parser MountConfig
forall a. String -> (KeyMap Value -> Parser a) -> Value -> Parser a
withObject String
"MountConfig" KeyMap Value -> Parser MountConfig
mountConfigParser

mountConfigParser :: KeyMap.KeyMap Value -> Parser MountConfig
mountConfigParser :: KeyMap Value -> Parser MountConfig
mountConfigParser KeyMap Value
o = do
    String -> [Key] -> KeyMap Value -> Parser ()
rejectUnknownKeys String
"mount" [Key]
acceptedMountKeys KeyMap Value
o
    Maybe RegistryUrl
-> RegistryUrl
-> Maybe RegistryUrl
-> Maybe Secret
-> CredentialBackend
-> Bool
-> Maybe Text
-> Maybe Text
-> Maybe Text
-> Maybe Natural
-> Maybe RegistryUrl
-> Maybe Secret
-> [Scope]
-> RulePatch
-> MountConfig
MountConfig
        (Maybe RegistryUrl
 -> RegistryUrl
 -> Maybe RegistryUrl
 -> Maybe Secret
 -> CredentialBackend
 -> Bool
 -> Maybe Text
 -> Maybe Text
 -> Maybe Text
 -> Maybe Natural
 -> Maybe RegistryUrl
 -> Maybe Secret
 -> [Scope]
 -> RulePatch
 -> MountConfig)
-> Parser (Maybe RegistryUrl)
-> Parser
     (RegistryUrl
      -> Maybe RegistryUrl
      -> Maybe Secret
      -> CredentialBackend
      -> Bool
      -> Maybe Text
      -> Maybe Text
      -> Maybe Text
      -> Maybe Natural
      -> Maybe RegistryUrl
      -> Maybe Secret
      -> [Scope]
      -> RulePatch
      -> MountConfig)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (KeyMap Value
o KeyMap Value -> Key -> Parser (Maybe Value)
forall a. FromJSON a => KeyMap Value -> Key -> Parser (Maybe a)
.:? Key
"privateUpstream" Parser (Maybe Value)
-> (Maybe Value -> Parser (Maybe RegistryUrl))
-> Parser (Maybe RegistryUrl)
forall a b. Parser a -> (a -> Parser b) -> Parser b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (Value -> Parser RegistryUrl)
-> Maybe Value -> Parser (Maybe RegistryUrl)
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> Maybe a -> f (Maybe b)
traverse Value -> Parser RegistryUrl
parseRegistryUrl)
        Parser
  (RegistryUrl
   -> Maybe RegistryUrl
   -> Maybe Secret
   -> CredentialBackend
   -> Bool
   -> Maybe Text
   -> Maybe Text
   -> Maybe Text
   -> Maybe Natural
   -> Maybe RegistryUrl
   -> Maybe Secret
   -> [Scope]
   -> RulePatch
   -> MountConfig)
-> Parser RegistryUrl
-> Parser
     (Maybe RegistryUrl
      -> Maybe Secret
      -> CredentialBackend
      -> Bool
      -> Maybe Text
      -> Maybe Text
      -> Maybe Text
      -> Maybe Natural
      -> Maybe RegistryUrl
      -> Maybe Secret
      -> [Scope]
      -> RulePatch
      -> MountConfig)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (KeyMap Value
o KeyMap Value -> Key -> Parser Value
forall a. FromJSON a => KeyMap Value -> Key -> Parser a
.: Key
"publicUpstream" Parser Value -> (Value -> Parser RegistryUrl) -> Parser RegistryUrl
forall a b. Parser a -> (a -> Parser b) -> Parser b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Value -> Parser RegistryUrl
parseRegistryUrl)
        Parser
  (Maybe RegistryUrl
   -> Maybe Secret
   -> CredentialBackend
   -> Bool
   -> Maybe Text
   -> Maybe Text
   -> Maybe Text
   -> Maybe Natural
   -> Maybe RegistryUrl
   -> Maybe Secret
   -> [Scope]
   -> RulePatch
   -> MountConfig)
-> Parser (Maybe RegistryUrl)
-> Parser
     (Maybe Secret
      -> CredentialBackend
      -> Bool
      -> Maybe Text
      -> Maybe Text
      -> Maybe Text
      -> Maybe Natural
      -> Maybe RegistryUrl
      -> Maybe Secret
      -> [Scope]
      -> RulePatch
      -> MountConfig)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (KeyMap Value
o KeyMap Value -> Key -> Parser (Maybe Value)
forall a. FromJSON a => KeyMap Value -> Key -> Parser (Maybe a)
.:? Key
"mirrorTarget" Parser (Maybe Value)
-> (Maybe Value -> Parser (Maybe RegistryUrl))
-> Parser (Maybe RegistryUrl)
forall a b. Parser a -> (a -> Parser b) -> Parser b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (Value -> Parser RegistryUrl)
-> Maybe Value -> Parser (Maybe RegistryUrl)
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> Maybe a -> f (Maybe b)
traverse Value -> Parser RegistryUrl
parseRegistryUrl)
        Parser
  (Maybe Secret
   -> CredentialBackend
   -> Bool
   -> Maybe Text
   -> Maybe Text
   -> Maybe Text
   -> Maybe Natural
   -> Maybe RegistryUrl
   -> Maybe Secret
   -> [Scope]
   -> RulePatch
   -> MountConfig)
-> Parser (Maybe Secret)
-> Parser
     (CredentialBackend
      -> Bool
      -> Maybe Text
      -> Maybe Text
      -> Maybe Text
      -> Maybe Natural
      -> Maybe RegistryUrl
      -> Maybe Secret
      -> [Scope]
      -> RulePatch
      -> MountConfig)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (KeyMap Value
o KeyMap Value -> Key -> Parser (Maybe Value)
forall a. FromJSON a => KeyMap Value -> Key -> Parser (Maybe a)
.:? Key
"mirrorTargetToken" Parser (Maybe Value)
-> (Maybe Value -> Parser (Maybe Secret)) -> Parser (Maybe Secret)
forall a b. Parser a -> (a -> Parser b) -> Parser b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (Value -> Parser Secret) -> Maybe Value -> Parser (Maybe Secret)
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> Maybe a -> f (Maybe b)
traverse Value -> Parser Secret
parseSecret)
        Parser
  (CredentialBackend
   -> Bool
   -> Maybe Text
   -> Maybe Text
   -> Maybe Text
   -> Maybe Natural
   -> Maybe RegistryUrl
   -> Maybe Secret
   -> [Scope]
   -> RulePatch
   -> MountConfig)
-> Parser CredentialBackend
-> Parser
     (Bool
      -> Maybe Text
      -> Maybe Text
      -> Maybe Text
      -> Maybe Natural
      -> Maybe RegistryUrl
      -> Maybe Secret
      -> [Scope]
      -> RulePatch
      -> MountConfig)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (KeyMap Value
o KeyMap Value -> Key -> Parser Value
forall a. FromJSON a => KeyMap Value -> Key -> Parser a
.: Key
"credentialProvider" Parser Value
-> (Value -> Parser CredentialBackend) -> Parser CredentialBackend
forall a b. Parser a -> (a -> Parser b) -> Parser b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (Text -> Either Text CredentialBackend)
-> String -> Value -> Parser CredentialBackend
forall a. (Text -> Either Text a) -> String -> Value -> Parser a
parseEnum Text -> Either Text CredentialBackend
parseCredentialBackend String
"credentialProvider")
        Parser
  (Bool
   -> Maybe Text
   -> Maybe Text
   -> Maybe Text
   -> Maybe Natural
   -> Maybe RegistryUrl
   -> Maybe Secret
   -> [Scope]
   -> RulePatch
   -> MountConfig)
-> Parser Bool
-> Parser
     (Maybe Text
      -> Maybe Text
      -> Maybe Text
      -> Maybe Natural
      -> Maybe RegistryUrl
      -> Maybe Secret
      -> [Scope]
      -> RulePatch
      -> MountConfig)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> KeyMap Value
o KeyMap Value -> Key -> Parser Bool
forall a. FromJSON a => KeyMap Value -> Key -> Parser a
.: Key
"respectUpstreamTarballHost"
        Parser
  (Maybe Text
   -> Maybe Text
   -> Maybe Text
   -> Maybe Natural
   -> Maybe RegistryUrl
   -> Maybe Secret
   -> [Scope]
   -> RulePatch
   -> MountConfig)
-> Parser (Maybe Text)
-> Parser
     (Maybe Text
      -> Maybe Text
      -> Maybe Natural
      -> Maybe RegistryUrl
      -> Maybe Secret
      -> [Scope]
      -> RulePatch
      -> MountConfig)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> KeyMap Value
o KeyMap Value -> Key -> Parser (Maybe Text)
forall a. FromJSON a => KeyMap Value -> Key -> Parser (Maybe a)
.:? Key
"mirrorCodeArtifactDomain"
        Parser
  (Maybe Text
   -> Maybe Text
   -> Maybe Natural
   -> Maybe RegistryUrl
   -> Maybe Secret
   -> [Scope]
   -> RulePatch
   -> MountConfig)
-> Parser (Maybe Text)
-> Parser
     (Maybe Text
      -> Maybe Natural
      -> Maybe RegistryUrl
      -> Maybe Secret
      -> [Scope]
      -> RulePatch
      -> MountConfig)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (KeyMap Value
o KeyMap Value -> Key -> Parser (Maybe Value)
forall a. FromJSON a => KeyMap Value -> Key -> Parser (Maybe a)
.:? Key
"mirrorCodeArtifactDomainOwner" Parser (Maybe Value)
-> (Maybe Value -> Parser (Maybe Text)) -> Parser (Maybe Text)
forall a b. Parser a -> (a -> Parser b) -> Parser b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (Value -> Parser Text) -> Maybe Value -> Parser (Maybe Text)
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> Maybe a -> f (Maybe b)
traverse Value -> Parser Text
parseTextOrNumber)
        Parser
  (Maybe Text
   -> Maybe Natural
   -> Maybe RegistryUrl
   -> Maybe Secret
   -> [Scope]
   -> RulePatch
   -> MountConfig)
-> Parser (Maybe Text)
-> Parser
     (Maybe Natural
      -> Maybe RegistryUrl
      -> Maybe Secret
      -> [Scope]
      -> RulePatch
      -> MountConfig)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> KeyMap Value
o KeyMap Value -> Key -> Parser (Maybe Text)
forall a. FromJSON a => KeyMap Value -> Key -> Parser (Maybe a)
.:? Key
"mirrorCodeArtifactRegion"
        Parser
  (Maybe Natural
   -> Maybe RegistryUrl
   -> Maybe Secret
   -> [Scope]
   -> RulePatch
   -> MountConfig)
-> Parser (Maybe Natural)
-> Parser
     (Maybe RegistryUrl
      -> Maybe Secret -> [Scope] -> RulePatch -> MountConfig)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (KeyMap Value
o KeyMap Value -> Key -> Parser (Maybe Value)
forall a. FromJSON a => KeyMap Value -> Key -> Parser (Maybe a)
.:? Key
"mirrorCodeArtifactTokenDuration" Parser (Maybe Value)
-> (Maybe Value -> Parser (Maybe Natural))
-> Parser (Maybe Natural)
forall a b. Parser a -> (a -> Parser b) -> Parser b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (Value -> Parser Natural) -> Maybe Value -> Parser (Maybe Natural)
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> Maybe a -> f (Maybe b)
traverse Value -> Parser Natural
parseDuration)
        Parser
  (Maybe RegistryUrl
   -> Maybe Secret -> [Scope] -> RulePatch -> MountConfig)
-> Parser (Maybe RegistryUrl)
-> Parser (Maybe Secret -> [Scope] -> RulePatch -> MountConfig)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (KeyMap Value
o KeyMap Value -> Key -> Parser (Maybe Value)
forall a. FromJSON a => KeyMap Value -> Key -> Parser (Maybe a)
.:? Key
"publicationTarget" Parser (Maybe Value)
-> (Maybe Value -> Parser (Maybe RegistryUrl))
-> Parser (Maybe RegistryUrl)
forall a b. Parser a -> (a -> Parser b) -> Parser b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (Value -> Parser RegistryUrl)
-> Maybe Value -> Parser (Maybe RegistryUrl)
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> Maybe a -> f (Maybe b)
traverse Value -> Parser RegistryUrl
parseRegistryUrl)
        Parser (Maybe Secret -> [Scope] -> RulePatch -> MountConfig)
-> Parser (Maybe Secret)
-> Parser ([Scope] -> RulePatch -> MountConfig)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (KeyMap Value
o KeyMap Value -> Key -> Parser (Maybe Value)
forall a. FromJSON a => KeyMap Value -> Key -> Parser (Maybe a)
.:? Key
"publicationTargetToken" Parser (Maybe Value)
-> (Maybe Value -> Parser (Maybe Secret)) -> Parser (Maybe Secret)
forall a b. Parser a -> (a -> Parser b) -> Parser b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (Value -> Parser Secret) -> Maybe Value -> Parser (Maybe Secret)
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> Maybe a -> f (Maybe b)
traverse Value -> Parser Secret
parseSecret)
        Parser ([Scope] -> RulePatch -> MountConfig)
-> Parser [Scope] -> Parser (RulePatch -> MountConfig)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (KeyMap Value
o KeyMap Value -> Key -> Parser (Maybe Value)
forall a. FromJSON a => KeyMap Value -> Key -> Parser (Maybe a)
.:? Key
"publishScopes" Parser (Maybe Value) -> Value -> Parser Value
forall a. Parser (Maybe a) -> a -> Parser a
.!= Text -> Value
String Text
"" Parser Value -> (Value -> Parser [Scope]) -> Parser [Scope]
forall a b. Parser a -> (a -> Parser b) -> Parser b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Value -> Parser [Scope]
parseScopes)
        Parser (RulePatch -> MountConfig)
-> Parser RulePatch -> Parser MountConfig
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> KeyMap Value
o KeyMap Value -> Key -> Parser (Maybe RulePatch)
forall a. FromJSON a => KeyMap Value -> Key -> Parser (Maybe a)
.:? Key
"rules" Parser (Maybe RulePatch) -> RulePatch -> Parser RulePatch
forall a. Parser (Maybe a) -> a -> Parser a
.!= Map Text RuleEntry -> RulePatch
RulePatch Map Text RuleEntry
forall k a. Map k a
Map.empty

acceptedMountKeys :: [Key.Key]
acceptedMountKeys :: [Key]
acceptedMountKeys =
    [ Key
"privateUpstream"
    , Key
"publicUpstream"
    , Key
"mirrorTarget"
    , Key
"mirrorTargetToken"
    , Key
"credentialProvider"
    , Key
"respectUpstreamTarballHost"
    , Key
"mirrorCodeArtifactDomain"
    , Key
"mirrorCodeArtifactDomainOwner"
    , Key
"mirrorCodeArtifactRegion"
    , Key
"mirrorCodeArtifactTokenDuration"
    , Key
"publicationTarget"
    , Key
"publicationTargetToken"
    , Key
"publishScopes"
    , Key
"rules"
    ]

parseDuration :: Value -> Parser Natural
parseDuration :: Value -> Parser Natural
parseDuration (String Text
t) = case String -> Maybe Natural
forall a. Read a => String -> Maybe a
readMaybe (Text -> String
T.unpack Text
t) :: Maybe Natural of
    Just Natural
n -> Natural -> Parser Natural
forall a. a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Natural
n
    Maybe Natural
Nothing -> String -> Parser Natural
forall a. String -> Parser a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail (String
"invalid duration: " String -> String -> String
forall a. Semigroup a => a -> a -> a
<> Text -> String
T.unpack Text
t)
parseDuration Value
v = Value -> Parser Natural
forall a. FromJSON a => Value -> Parser a
parseJSON Value
v

parseTextOrNumber :: Value -> Parser Text
parseTextOrNumber :: Value -> Parser Text
parseTextOrNumber (String Text
t) = Text -> Parser Text
forall a. a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Text
t
parseTextOrNumber Value
v = String -> Text
T.pack (String -> Text) -> (Integer -> String) -> Integer -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Integer -> String
forall b a. (Show a, IsString b) => a -> b
show (Integer -> Text) -> Parser Integer -> Parser Text
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Value -> Parser Integer
forall a. FromJSON a => Value -> Parser a
parseJSON Value
v :: Parser Integer)

parseScopes :: Value -> Parser [Scope]
parseScopes :: Value -> Parser [Scope]
parseScopes = String -> (Text -> Parser [Scope]) -> Value -> Parser [Scope]
forall a. String -> (Text -> Parser a) -> Value -> Parser a
withText String
"Scopes" ((Text -> Parser [Scope]) -> Value -> Parser [Scope])
-> (Text -> Parser [Scope]) -> Value -> Parser [Scope]
forall a b. (a -> b) -> a -> b
$ \Text
t ->
    if Text -> Bool
T.null (Text -> Text
T.strip Text
t)
        then [Scope] -> Parser [Scope]
forall a. a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure []
        else [Scope] -> Parser [Scope]
forall a. a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ((Text -> Scope) -> [Text] -> [Scope]
forall a b. (a -> b) -> [a] -> [b]
map (Text -> Scope
mkScope (Text -> Scope) -> (Text -> Text) -> Text -> Scope
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> Text
T.strip) (HasCallStack => Text -> Text -> [Text]
Text -> Text -> [Text]
T.splitOn Text
"," Text
t))

instance FromJSON AppConfig where
    parseJSON :: Value -> Parser AppConfig
parseJSON = String
-> (KeyMap Value -> Parser AppConfig) -> Value -> Parser AppConfig
forall a. String -> (KeyMap Value -> Parser a) -> Value -> Parser a
withObject String
"AppConfig" KeyMap Value -> Parser AppConfig
appConfigParser

appConfigParser :: KeyMap.KeyMap Value -> Parser AppConfig
appConfigParser :: KeyMap Value -> Parser AppConfig
appConfigParser KeyMap Value
o = do
    String -> [Key] -> KeyMap Value -> Parser ()
rejectUnknownKeys String
"document" [Key]
acceptedDocumentKeys KeyMap Value
o
    Int
-> Map Ecosystem MountConfig
-> QueueBackend
-> Maybe Url
-> Int
-> Maybe Text
-> Maybe Text
-> Maybe Text
-> Maybe Text
-> Maybe Secret
-> Maybe Text
-> NominalDiffTime
-> Int
-> Maybe Int
-> Maybe Int
-> Maybe Int
-> Maybe Int
-> Maybe Int
-> NominalDiffTime
-> Int
-> Int
-> Int
-> Int
-> Int
-> LogFormat
-> TelemetrySwitch
-> Maybe Url
-> MinIntegrity
-> MinTrustedIntegrity
-> [IPRange]
-> String
-> Text
-> Maybe Text
-> NominalDiffTime
-> Int
-> AppConfig
AppConfig
        (Int
 -> Map Ecosystem MountConfig
 -> QueueBackend
 -> Maybe Url
 -> Int
 -> Maybe Text
 -> Maybe Text
 -> Maybe Text
 -> Maybe Text
 -> Maybe Secret
 -> Maybe Text
 -> NominalDiffTime
 -> Int
 -> Maybe Int
 -> Maybe Int
 -> Maybe Int
 -> Maybe Int
 -> Maybe Int
 -> NominalDiffTime
 -> Int
 -> Int
 -> Int
 -> Int
 -> Int
 -> LogFormat
 -> TelemetrySwitch
 -> Maybe Url
 -> MinIntegrity
 -> MinTrustedIntegrity
 -> [IPRange]
 -> String
 -> Text
 -> Maybe Text
 -> NominalDiffTime
 -> Int
 -> AppConfig)
-> Parser Int
-> Parser
     (Map Ecosystem MountConfig
      -> QueueBackend
      -> Maybe Url
      -> Int
      -> Maybe Text
      -> Maybe Text
      -> Maybe Text
      -> Maybe Text
      -> Maybe Secret
      -> Maybe Text
      -> NominalDiffTime
      -> Int
      -> Maybe Int
      -> Maybe Int
      -> Maybe Int
      -> Maybe Int
      -> Maybe Int
      -> NominalDiffTime
      -> Int
      -> Int
      -> Int
      -> Int
      -> Int
      -> LogFormat
      -> TelemetrySwitch
      -> Maybe Url
      -> MinIntegrity
      -> MinTrustedIntegrity
      -> [IPRange]
      -> String
      -> Text
      -> Maybe Text
      -> NominalDiffTime
      -> Int
      -> AppConfig)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> KeyMap Value
o KeyMap Value -> Key -> Parser Int
forall a. FromJSON a => KeyMap Value -> Key -> Parser a
.: Key
"port"
        Parser
  (Map Ecosystem MountConfig
   -> QueueBackend
   -> Maybe Url
   -> Int
   -> Maybe Text
   -> Maybe Text
   -> Maybe Text
   -> Maybe Text
   -> Maybe Secret
   -> Maybe Text
   -> NominalDiffTime
   -> Int
   -> Maybe Int
   -> Maybe Int
   -> Maybe Int
   -> Maybe Int
   -> Maybe Int
   -> NominalDiffTime
   -> Int
   -> Int
   -> Int
   -> Int
   -> Int
   -> LogFormat
   -> TelemetrySwitch
   -> Maybe Url
   -> MinIntegrity
   -> MinTrustedIntegrity
   -> [IPRange]
   -> String
   -> Text
   -> Maybe Text
   -> NominalDiffTime
   -> Int
   -> AppConfig)
-> Parser (Map Ecosystem MountConfig)
-> Parser
     (QueueBackend
      -> Maybe Url
      -> Int
      -> Maybe Text
      -> Maybe Text
      -> Maybe Text
      -> Maybe Text
      -> Maybe Secret
      -> Maybe Text
      -> NominalDiffTime
      -> Int
      -> Maybe Int
      -> Maybe Int
      -> Maybe Int
      -> Maybe Int
      -> Maybe Int
      -> NominalDiffTime
      -> Int
      -> Int
      -> Int
      -> Int
      -> Int
      -> LogFormat
      -> TelemetrySwitch
      -> Maybe Url
      -> MinIntegrity
      -> MinTrustedIntegrity
      -> [IPRange]
      -> String
      -> Text
      -> Maybe Text
      -> NominalDiffTime
      -> Int
      -> AppConfig)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (KeyMap Value
o KeyMap Value -> Key -> Parser (Maybe (KeyMap Value))
forall a. FromJSON a => KeyMap Value -> Key -> Parser (Maybe a)
.:? Key
"mounts" Parser (Maybe (KeyMap Value))
-> KeyMap Value -> Parser (KeyMap Value)
forall a. Parser (Maybe a) -> a -> Parser a
.!= KeyMap Value
forall a. Monoid a => a
mempty Parser (KeyMap Value)
-> (KeyMap Value -> Parser (Map Ecosystem MountConfig))
-> Parser (Map Ecosystem MountConfig)
forall a b. Parser a -> (a -> Parser b) -> Parser b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= KeyMap Value -> Parser (Map Ecosystem MountConfig)
parseMounts)
        Parser
  (QueueBackend
   -> Maybe Url
   -> Int
   -> Maybe Text
   -> Maybe Text
   -> Maybe Text
   -> Maybe Text
   -> Maybe Secret
   -> Maybe Text
   -> NominalDiffTime
   -> Int
   -> Maybe Int
   -> Maybe Int
   -> Maybe Int
   -> Maybe Int
   -> Maybe Int
   -> NominalDiffTime
   -> Int
   -> Int
   -> Int
   -> Int
   -> Int
   -> LogFormat
   -> TelemetrySwitch
   -> Maybe Url
   -> MinIntegrity
   -> MinTrustedIntegrity
   -> [IPRange]
   -> String
   -> Text
   -> Maybe Text
   -> NominalDiffTime
   -> Int
   -> AppConfig)
-> Parser QueueBackend
-> Parser
     (Maybe Url
      -> Int
      -> Maybe Text
      -> Maybe Text
      -> Maybe Text
      -> Maybe Text
      -> Maybe Secret
      -> Maybe Text
      -> NominalDiffTime
      -> Int
      -> Maybe Int
      -> Maybe Int
      -> Maybe Int
      -> Maybe Int
      -> Maybe Int
      -> NominalDiffTime
      -> Int
      -> Int
      -> Int
      -> Int
      -> Int
      -> LogFormat
      -> TelemetrySwitch
      -> Maybe Url
      -> MinIntegrity
      -> MinTrustedIntegrity
      -> [IPRange]
      -> String
      -> Text
      -> Maybe Text
      -> NominalDiffTime
      -> Int
      -> AppConfig)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (KeyMap Value
o KeyMap Value -> Key -> Parser Value
forall a. FromJSON a => KeyMap Value -> Key -> Parser a
.: Key
"queueBackend" Parser Value
-> (Value -> Parser QueueBackend) -> Parser QueueBackend
forall a b. Parser a -> (a -> Parser b) -> Parser b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (Text -> Either Text QueueBackend)
-> String -> Value -> Parser QueueBackend
forall a. (Text -> Either Text a) -> String -> Value -> Parser a
parseEnum Text -> Either Text QueueBackend
parseQueueBackend String
"queueBackend")
        Parser
  (Maybe Url
   -> Int
   -> Maybe Text
   -> Maybe Text
   -> Maybe Text
   -> Maybe Text
   -> Maybe Secret
   -> Maybe Text
   -> NominalDiffTime
   -> Int
   -> Maybe Int
   -> Maybe Int
   -> Maybe Int
   -> Maybe Int
   -> Maybe Int
   -> NominalDiffTime
   -> Int
   -> Int
   -> Int
   -> Int
   -> Int
   -> LogFormat
   -> TelemetrySwitch
   -> Maybe Url
   -> MinIntegrity
   -> MinTrustedIntegrity
   -> [IPRange]
   -> String
   -> Text
   -> Maybe Text
   -> NominalDiffTime
   -> Int
   -> AppConfig)
-> Parser (Maybe Url)
-> Parser
     (Int
      -> Maybe Text
      -> Maybe Text
      -> Maybe Text
      -> Maybe Text
      -> Maybe Secret
      -> Maybe Text
      -> NominalDiffTime
      -> Int
      -> Maybe Int
      -> Maybe Int
      -> Maybe Int
      -> Maybe Int
      -> Maybe Int
      -> NominalDiffTime
      -> Int
      -> Int
      -> Int
      -> Int
      -> Int
      -> LogFormat
      -> TelemetrySwitch
      -> Maybe Url
      -> MinIntegrity
      -> MinTrustedIntegrity
      -> [IPRange]
      -> String
      -> Text
      -> Maybe Text
      -> NominalDiffTime
      -> Int
      -> AppConfig)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (KeyMap Value
o KeyMap Value -> Key -> Parser (Maybe Value)
forall a. FromJSON a => KeyMap Value -> Key -> Parser (Maybe a)
.:? Key
"queueUrl" Parser (Maybe Value)
-> (Maybe Value -> Parser (Maybe Url)) -> Parser (Maybe Url)
forall a b. Parser a -> (a -> Parser b) -> Parser b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (Value -> Parser Url) -> Maybe Value -> Parser (Maybe Url)
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> Maybe a -> f (Maybe b)
traverse Value -> Parser Url
parseUrl)
        Parser
  (Int
   -> Maybe Text
   -> Maybe Text
   -> Maybe Text
   -> Maybe Text
   -> Maybe Secret
   -> Maybe Text
   -> NominalDiffTime
   -> Int
   -> Maybe Int
   -> Maybe Int
   -> Maybe Int
   -> Maybe Int
   -> Maybe Int
   -> NominalDiffTime
   -> Int
   -> Int
   -> Int
   -> Int
   -> Int
   -> LogFormat
   -> TelemetrySwitch
   -> Maybe Url
   -> MinIntegrity
   -> MinTrustedIntegrity
   -> [IPRange]
   -> String
   -> Text
   -> Maybe Text
   -> NominalDiffTime
   -> Int
   -> AppConfig)
-> Parser Int
-> Parser
     (Maybe Text
      -> Maybe Text
      -> Maybe Text
      -> Maybe Text
      -> Maybe Secret
      -> Maybe Text
      -> NominalDiffTime
      -> Int
      -> Maybe Int
      -> Maybe Int
      -> Maybe Int
      -> Maybe Int
      -> Maybe Int
      -> NominalDiffTime
      -> Int
      -> Int
      -> Int
      -> Int
      -> Int
      -> LogFormat
      -> TelemetrySwitch
      -> Maybe Url
      -> MinIntegrity
      -> MinTrustedIntegrity
      -> [IPRange]
      -> String
      -> Text
      -> Maybe Text
      -> NominalDiffTime
      -> Int
      -> AppConfig)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> KeyMap Value
o KeyMap Value -> Key -> Parser Int
forall a. FromJSON a => KeyMap Value -> Key -> Parser a
.: Key
"queueMemoryMaxDepth"
        Parser
  (Maybe Text
   -> Maybe Text
   -> Maybe Text
   -> Maybe Text
   -> Maybe Secret
   -> Maybe Text
   -> NominalDiffTime
   -> Int
   -> Maybe Int
   -> Maybe Int
   -> Maybe Int
   -> Maybe Int
   -> Maybe Int
   -> NominalDiffTime
   -> Int
   -> Int
   -> Int
   -> Int
   -> Int
   -> LogFormat
   -> TelemetrySwitch
   -> Maybe Url
   -> MinIntegrity
   -> MinTrustedIntegrity
   -> [IPRange]
   -> String
   -> Text
   -> Maybe Text
   -> NominalDiffTime
   -> Int
   -> AppConfig)
-> Parser (Maybe Text)
-> Parser
     (Maybe Text
      -> Maybe Text
      -> Maybe Text
      -> Maybe Secret
      -> Maybe Text
      -> NominalDiffTime
      -> Int
      -> Maybe Int
      -> Maybe Int
      -> Maybe Int
      -> Maybe Int
      -> Maybe Int
      -> NominalDiffTime
      -> Int
      -> Int
      -> Int
      -> Int
      -> Int
      -> LogFormat
      -> TelemetrySwitch
      -> Maybe Url
      -> MinIntegrity
      -> MinTrustedIntegrity
      -> [IPRange]
      -> String
      -> Text
      -> Maybe Text
      -> NominalDiffTime
      -> Int
      -> AppConfig)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> KeyMap Value
o KeyMap Value -> Key -> Parser (Maybe Text)
forall a. FromJSON a => KeyMap Value -> Key -> Parser (Maybe a)
.:? Key
"awsRegion"
        Parser
  (Maybe Text
   -> Maybe Text
   -> Maybe Text
   -> Maybe Secret
   -> Maybe Text
   -> NominalDiffTime
   -> Int
   -> Maybe Int
   -> Maybe Int
   -> Maybe Int
   -> Maybe Int
   -> Maybe Int
   -> NominalDiffTime
   -> Int
   -> Int
   -> Int
   -> Int
   -> Int
   -> LogFormat
   -> TelemetrySwitch
   -> Maybe Url
   -> MinIntegrity
   -> MinTrustedIntegrity
   -> [IPRange]
   -> String
   -> Text
   -> Maybe Text
   -> NominalDiffTime
   -> Int
   -> AppConfig)
-> Parser (Maybe Text)
-> Parser
     (Maybe Text
      -> Maybe Text
      -> Maybe Secret
      -> Maybe Text
      -> NominalDiffTime
      -> Int
      -> Maybe Int
      -> Maybe Int
      -> Maybe Int
      -> Maybe Int
      -> Maybe Int
      -> NominalDiffTime
      -> Int
      -> Int
      -> Int
      -> Int
      -> Int
      -> LogFormat
      -> TelemetrySwitch
      -> Maybe Url
      -> MinIntegrity
      -> MinTrustedIntegrity
      -> [IPRange]
      -> String
      -> Text
      -> Maybe Text
      -> NominalDiffTime
      -> Int
      -> AppConfig)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> KeyMap Value
o KeyMap Value -> Key -> Parser (Maybe Text)
forall a. FromJSON a => KeyMap Value -> Key -> Parser (Maybe a)
.:? Key
"awsEndpointUrlSqs"
        Parser
  (Maybe Text
   -> Maybe Text
   -> Maybe Secret
   -> Maybe Text
   -> NominalDiffTime
   -> Int
   -> Maybe Int
   -> Maybe Int
   -> Maybe Int
   -> Maybe Int
   -> Maybe Int
   -> NominalDiffTime
   -> Int
   -> Int
   -> Int
   -> Int
   -> Int
   -> LogFormat
   -> TelemetrySwitch
   -> Maybe Url
   -> MinIntegrity
   -> MinTrustedIntegrity
   -> [IPRange]
   -> String
   -> Text
   -> Maybe Text
   -> NominalDiffTime
   -> Int
   -> AppConfig)
-> Parser (Maybe Text)
-> Parser
     (Maybe Text
      -> Maybe Secret
      -> Maybe Text
      -> NominalDiffTime
      -> Int
      -> Maybe Int
      -> Maybe Int
      -> Maybe Int
      -> Maybe Int
      -> Maybe Int
      -> NominalDiffTime
      -> Int
      -> Int
      -> Int
      -> Int
      -> Int
      -> LogFormat
      -> TelemetrySwitch
      -> Maybe Url
      -> MinIntegrity
      -> MinTrustedIntegrity
      -> [IPRange]
      -> String
      -> Text
      -> Maybe Text
      -> NominalDiffTime
      -> Int
      -> AppConfig)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> KeyMap Value
o KeyMap Value -> Key -> Parser (Maybe Text)
forall a. FromJSON a => KeyMap Value -> Key -> Parser (Maybe a)
.:? Key
"awsEndpointUrl"
        Parser
  (Maybe Text
   -> Maybe Secret
   -> Maybe Text
   -> NominalDiffTime
   -> Int
   -> Maybe Int
   -> Maybe Int
   -> Maybe Int
   -> Maybe Int
   -> Maybe Int
   -> NominalDiffTime
   -> Int
   -> Int
   -> Int
   -> Int
   -> Int
   -> LogFormat
   -> TelemetrySwitch
   -> Maybe Url
   -> MinIntegrity
   -> MinTrustedIntegrity
   -> [IPRange]
   -> String
   -> Text
   -> Maybe Text
   -> NominalDiffTime
   -> Int
   -> AppConfig)
-> Parser (Maybe Text)
-> Parser
     (Maybe Secret
      -> Maybe Text
      -> NominalDiffTime
      -> Int
      -> Maybe Int
      -> Maybe Int
      -> Maybe Int
      -> Maybe Int
      -> Maybe Int
      -> NominalDiffTime
      -> Int
      -> Int
      -> Int
      -> Int
      -> Int
      -> LogFormat
      -> TelemetrySwitch
      -> Maybe Url
      -> MinIntegrity
      -> MinTrustedIntegrity
      -> [IPRange]
      -> String
      -> Text
      -> Maybe Text
      -> NominalDiffTime
      -> Int
      -> AppConfig)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> KeyMap Value
o KeyMap Value -> Key -> Parser (Maybe Text)
forall a. FromJSON a => KeyMap Value -> Key -> Parser (Maybe a)
.:? Key
"googleProject"
        Parser
  (Maybe Secret
   -> Maybe Text
   -> NominalDiffTime
   -> Int
   -> Maybe Int
   -> Maybe Int
   -> Maybe Int
   -> Maybe Int
   -> Maybe Int
   -> NominalDiffTime
   -> Int
   -> Int
   -> Int
   -> Int
   -> Int
   -> LogFormat
   -> TelemetrySwitch
   -> Maybe Url
   -> MinIntegrity
   -> MinTrustedIntegrity
   -> [IPRange]
   -> String
   -> Text
   -> Maybe Text
   -> NominalDiffTime
   -> Int
   -> AppConfig)
-> Parser (Maybe Secret)
-> Parser
     (Maybe Text
      -> NominalDiffTime
      -> Int
      -> Maybe Int
      -> Maybe Int
      -> Maybe Int
      -> Maybe Int
      -> Maybe Int
      -> NominalDiffTime
      -> Int
      -> Int
      -> Int
      -> Int
      -> Int
      -> LogFormat
      -> TelemetrySwitch
      -> Maybe Url
      -> MinIntegrity
      -> MinTrustedIntegrity
      -> [IPRange]
      -> String
      -> Text
      -> Maybe Text
      -> NominalDiffTime
      -> Int
      -> AppConfig)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (KeyMap Value
o KeyMap Value -> Key -> Parser (Maybe Value)
forall a. FromJSON a => KeyMap Value -> Key -> Parser (Maybe a)
.:? Key
"authToken" Parser (Maybe Value)
-> (Maybe Value -> Parser (Maybe Secret)) -> Parser (Maybe Secret)
forall a b. Parser a -> (a -> Parser b) -> Parser b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (Value -> Parser Secret) -> Maybe Value -> Parser (Maybe Secret)
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> Maybe a -> f (Maybe b)
traverse Value -> Parser Secret
parseSecret)
        Parser
  (Maybe Text
   -> NominalDiffTime
   -> Int
   -> Maybe Int
   -> Maybe Int
   -> Maybe Int
   -> Maybe Int
   -> Maybe Int
   -> NominalDiffTime
   -> Int
   -> Int
   -> Int
   -> Int
   -> Int
   -> LogFormat
   -> TelemetrySwitch
   -> Maybe Url
   -> MinIntegrity
   -> MinTrustedIntegrity
   -> [IPRange]
   -> String
   -> Text
   -> Maybe Text
   -> NominalDiffTime
   -> Int
   -> AppConfig)
-> Parser (Maybe Text)
-> Parser
     (NominalDiffTime
      -> Int
      -> Maybe Int
      -> Maybe Int
      -> Maybe Int
      -> Maybe Int
      -> Maybe Int
      -> NominalDiffTime
      -> Int
      -> Int
      -> Int
      -> Int
      -> Int
      -> LogFormat
      -> TelemetrySwitch
      -> Maybe Url
      -> MinIntegrity
      -> MinTrustedIntegrity
      -> [IPRange]
      -> String
      -> Text
      -> Maybe Text
      -> NominalDiffTime
      -> Int
      -> AppConfig)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> KeyMap Value
o KeyMap Value -> Key -> Parser (Maybe Text)
forall a. FromJSON a => KeyMap Value -> Key -> Parser (Maybe a)
.:? Key
"helpMessage"
        Parser
  (NominalDiffTime
   -> Int
   -> Maybe Int
   -> Maybe Int
   -> Maybe Int
   -> Maybe Int
   -> Maybe Int
   -> NominalDiffTime
   -> Int
   -> Int
   -> Int
   -> Int
   -> Int
   -> LogFormat
   -> TelemetrySwitch
   -> Maybe Url
   -> MinIntegrity
   -> MinTrustedIntegrity
   -> [IPRange]
   -> String
   -> Text
   -> Maybe Text
   -> NominalDiffTime
   -> Int
   -> AppConfig)
-> Parser NominalDiffTime
-> Parser
     (Int
      -> Maybe Int
      -> Maybe Int
      -> Maybe Int
      -> Maybe Int
      -> Maybe Int
      -> NominalDiffTime
      -> Int
      -> Int
      -> Int
      -> Int
      -> Int
      -> LogFormat
      -> TelemetrySwitch
      -> Maybe Url
      -> MinIntegrity
      -> MinTrustedIntegrity
      -> [IPRange]
      -> String
      -> Text
      -> Maybe Text
      -> NominalDiffTime
      -> Int
      -> AppConfig)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (KeyMap Value
o KeyMap Value -> Key -> Parser Value
forall a. FromJSON a => KeyMap Value -> Key -> Parser a
.: Key
"cveSyncInterval" Parser Value
-> (Value -> Parser NominalDiffTime) -> Parser NominalDiffTime
forall a b. Parser a -> (a -> Parser b) -> Parser b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Value -> Parser NominalDiffTime
parseSeconds)
        Parser
  (Int
   -> Maybe Int
   -> Maybe Int
   -> Maybe Int
   -> Maybe Int
   -> Maybe Int
   -> NominalDiffTime
   -> Int
   -> Int
   -> Int
   -> Int
   -> Int
   -> LogFormat
   -> TelemetrySwitch
   -> Maybe Url
   -> MinIntegrity
   -> MinTrustedIntegrity
   -> [IPRange]
   -> String
   -> Text
   -> Maybe Text
   -> NominalDiffTime
   -> Int
   -> AppConfig)
-> Parser Int
-> Parser
     (Maybe Int
      -> Maybe Int
      -> Maybe Int
      -> Maybe Int
      -> Maybe Int
      -> NominalDiffTime
      -> Int
      -> Int
      -> Int
      -> Int
      -> Int
      -> LogFormat
      -> TelemetrySwitch
      -> Maybe Url
      -> MinIntegrity
      -> MinTrustedIntegrity
      -> [IPRange]
      -> String
      -> Text
      -> Maybe Text
      -> NominalDiffTime
      -> Int
      -> AppConfig)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> KeyMap Value
o KeyMap Value -> Key -> Parser Int
forall a. FromJSON a => KeyMap Value -> Key -> Parser a
.: Key
"shutdownDrainTimeout"
        Parser
  (Maybe Int
   -> Maybe Int
   -> Maybe Int
   -> Maybe Int
   -> Maybe Int
   -> NominalDiffTime
   -> Int
   -> Int
   -> Int
   -> Int
   -> Int
   -> LogFormat
   -> TelemetrySwitch
   -> Maybe Url
   -> MinIntegrity
   -> MinTrustedIntegrity
   -> [IPRange]
   -> String
   -> Text
   -> Maybe Text
   -> NominalDiffTime
   -> Int
   -> AppConfig)
-> Parser (Maybe Int)
-> Parser
     (Maybe Int
      -> Maybe Int
      -> Maybe Int
      -> Maybe Int
      -> NominalDiffTime
      -> Int
      -> Int
      -> Int
      -> Int
      -> Int
      -> LogFormat
      -> TelemetrySwitch
      -> Maybe Url
      -> MinIntegrity
      -> MinTrustedIntegrity
      -> [IPRange]
      -> String
      -> Text
      -> Maybe Text
      -> NominalDiffTime
      -> Int
      -> AppConfig)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (KeyMap Value
o KeyMap Value -> Key -> Parser (Maybe Int)
forall a. FromJSON a => KeyMap Value -> Key -> Parser (Maybe a)
.:? Key
"cores" Parser (Maybe Int)
-> (Maybe Int -> Parser (Maybe Int)) -> Parser (Maybe Int)
forall a b. Parser a -> (a -> Parser b) -> Parser b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (Int -> Parser Int) -> Maybe Int -> Parser (Maybe Int)
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> Maybe a -> f (Maybe b)
traverse (String -> Int -> Parser Int
parsePositiveInt String
"cores"))
        Parser
  (Maybe Int
   -> Maybe Int
   -> Maybe Int
   -> Maybe Int
   -> NominalDiffTime
   -> Int
   -> Int
   -> Int
   -> Int
   -> Int
   -> LogFormat
   -> TelemetrySwitch
   -> Maybe Url
   -> MinIntegrity
   -> MinTrustedIntegrity
   -> [IPRange]
   -> String
   -> Text
   -> Maybe Text
   -> NominalDiffTime
   -> Int
   -> AppConfig)
-> Parser (Maybe Int)
-> Parser
     (Maybe Int
      -> Maybe Int
      -> Maybe Int
      -> NominalDiffTime
      -> Int
      -> Int
      -> Int
      -> Int
      -> Int
      -> LogFormat
      -> TelemetrySwitch
      -> Maybe Url
      -> MinIntegrity
      -> MinTrustedIntegrity
      -> [IPRange]
      -> String
      -> Text
      -> Maybe Text
      -> NominalDiffTime
      -> Int
      -> AppConfig)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (KeyMap Value
o KeyMap Value -> Key -> Parser (Maybe Int)
forall a. FromJSON a => KeyMap Value -> Key -> Parser (Maybe a)
.:? Key
"maxHeapBytes" Parser (Maybe Int)
-> (Maybe Int -> Parser (Maybe Int)) -> Parser (Maybe Int)
forall a b. Parser a -> (a -> Parser b) -> Parser b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (Int -> Parser Int) -> Maybe Int -> Parser (Maybe Int)
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> Maybe a -> f (Maybe b)
traverse (String -> Int -> Parser Int
parsePositiveInt String
"maxHeapBytes"))
        Parser
  (Maybe Int
   -> Maybe Int
   -> Maybe Int
   -> NominalDiffTime
   -> Int
   -> Int
   -> Int
   -> Int
   -> Int
   -> LogFormat
   -> TelemetrySwitch
   -> Maybe Url
   -> MinIntegrity
   -> MinTrustedIntegrity
   -> [IPRange]
   -> String
   -> Text
   -> Maybe Text
   -> NominalDiffTime
   -> Int
   -> AppConfig)
-> Parser (Maybe Int)
-> Parser
     (Maybe Int
      -> Maybe Int
      -> NominalDiffTime
      -> Int
      -> Int
      -> Int
      -> Int
      -> Int
      -> LogFormat
      -> TelemetrySwitch
      -> Maybe Url
      -> MinIntegrity
      -> MinTrustedIntegrity
      -> [IPRange]
      -> String
      -> Text
      -> Maybe Text
      -> NominalDiffTime
      -> Int
      -> AppConfig)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (KeyMap Value
o KeyMap Value -> Key -> Parser (Maybe Int)
forall a. FromJSON a => KeyMap Value -> Key -> Parser (Maybe a)
.:? Key
"serveMaxInFlight" Parser (Maybe Int)
-> (Maybe Int -> Parser (Maybe Int)) -> Parser (Maybe Int)
forall a b. Parser a -> (a -> Parser b) -> Parser b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (Int -> Parser Int) -> Maybe Int -> Parser (Maybe Int)
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> Maybe a -> f (Maybe b)
traverse (String -> Int -> Parser Int
parsePositiveInt String
"serveMaxInFlight"))
        Parser
  (Maybe Int
   -> Maybe Int
   -> NominalDiffTime
   -> Int
   -> Int
   -> Int
   -> Int
   -> Int
   -> LogFormat
   -> TelemetrySwitch
   -> Maybe Url
   -> MinIntegrity
   -> MinTrustedIntegrity
   -> [IPRange]
   -> String
   -> Text
   -> Maybe Text
   -> NominalDiffTime
   -> Int
   -> AppConfig)
-> Parser (Maybe Int)
-> Parser
     (Maybe Int
      -> NominalDiffTime
      -> Int
      -> Int
      -> Int
      -> Int
      -> Int
      -> LogFormat
      -> TelemetrySwitch
      -> Maybe Url
      -> MinIntegrity
      -> MinTrustedIntegrity
      -> [IPRange]
      -> String
      -> Text
      -> Maybe Text
      -> NominalDiffTime
      -> Int
      -> AppConfig)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (KeyMap Value
o KeyMap Value -> Key -> Parser (Maybe Int)
forall a. FromJSON a => KeyMap Value -> Key -> Parser (Maybe a)
.:? Key
"publicConnectionsPerHost" Parser (Maybe Int)
-> (Maybe Int -> Parser (Maybe Int)) -> Parser (Maybe Int)
forall a b. Parser a -> (a -> Parser b) -> Parser b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (Int -> Parser Int) -> Maybe Int -> Parser (Maybe Int)
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> Maybe a -> f (Maybe b)
traverse (String -> Int -> Parser Int
parsePositiveInt String
"publicConnectionsPerHost"))
        Parser
  (Maybe Int
   -> NominalDiffTime
   -> Int
   -> Int
   -> Int
   -> Int
   -> Int
   -> LogFormat
   -> TelemetrySwitch
   -> Maybe Url
   -> MinIntegrity
   -> MinTrustedIntegrity
   -> [IPRange]
   -> String
   -> Text
   -> Maybe Text
   -> NominalDiffTime
   -> Int
   -> AppConfig)
-> Parser (Maybe Int)
-> Parser
     (NominalDiffTime
      -> Int
      -> Int
      -> Int
      -> Int
      -> Int
      -> LogFormat
      -> TelemetrySwitch
      -> Maybe Url
      -> MinIntegrity
      -> MinTrustedIntegrity
      -> [IPRange]
      -> String
      -> Text
      -> Maybe Text
      -> NominalDiffTime
      -> Int
      -> AppConfig)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (KeyMap Value
o KeyMap Value -> Key -> Parser (Maybe Int)
forall a. FromJSON a => KeyMap Value -> Key -> Parser (Maybe a)
.:? Key
"privateConnectionsPerHost" Parser (Maybe Int)
-> (Maybe Int -> Parser (Maybe Int)) -> Parser (Maybe Int)
forall a b. Parser a -> (a -> Parser b) -> Parser b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (Int -> Parser Int) -> Maybe Int -> Parser (Maybe Int)
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> Maybe a -> f (Maybe b)
traverse (String -> Int -> Parser Int
parsePositiveInt String
"privateConnectionsPerHost"))
        Parser
  (NominalDiffTime
   -> Int
   -> Int
   -> Int
   -> Int
   -> Int
   -> LogFormat
   -> TelemetrySwitch
   -> Maybe Url
   -> MinIntegrity
   -> MinTrustedIntegrity
   -> [IPRange]
   -> String
   -> Text
   -> Maybe Text
   -> NominalDiffTime
   -> Int
   -> AppConfig)
-> Parser NominalDiffTime
-> Parser
     (Int
      -> Int
      -> Int
      -> Int
      -> Int
      -> LogFormat
      -> TelemetrySwitch
      -> Maybe Url
      -> MinIntegrity
      -> MinTrustedIntegrity
      -> [IPRange]
      -> String
      -> Text
      -> Maybe Text
      -> NominalDiffTime
      -> Int
      -> AppConfig)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (KeyMap Value
o KeyMap Value -> Key -> Parser Value
forall a. FromJSON a => KeyMap Value -> Key -> Parser a
.: Key
"cacheTtl" Parser Value
-> (Value -> Parser NominalDiffTime) -> Parser NominalDiffTime
forall a b. Parser a -> (a -> Parser b) -> Parser b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Value -> Parser NominalDiffTime
parseSeconds)
        Parser
  (Int
   -> Int
   -> Int
   -> Int
   -> Int
   -> LogFormat
   -> TelemetrySwitch
   -> Maybe Url
   -> MinIntegrity
   -> MinTrustedIntegrity
   -> [IPRange]
   -> String
   -> Text
   -> Maybe Text
   -> NominalDiffTime
   -> Int
   -> AppConfig)
-> Parser Int
-> Parser
     (Int
      -> Int
      -> Int
      -> Int
      -> LogFormat
      -> TelemetrySwitch
      -> Maybe Url
      -> MinIntegrity
      -> MinTrustedIntegrity
      -> [IPRange]
      -> String
      -> Text
      -> Maybe Text
      -> NominalDiffTime
      -> Int
      -> AppConfig)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> KeyMap Value
o KeyMap Value -> Key -> Parser Int
forall a. FromJSON a => KeyMap Value -> Key -> Parser a
.: Key
"cacheMaxEntries"
        Parser
  (Int
   -> Int
   -> Int
   -> Int
   -> LogFormat
   -> TelemetrySwitch
   -> Maybe Url
   -> MinIntegrity
   -> MinTrustedIntegrity
   -> [IPRange]
   -> String
   -> Text
   -> Maybe Text
   -> NominalDiffTime
   -> Int
   -> AppConfig)
-> Parser Int
-> Parser
     (Int
      -> Int
      -> Int
      -> LogFormat
      -> TelemetrySwitch
      -> Maybe Url
      -> MinIntegrity
      -> MinTrustedIntegrity
      -> [IPRange]
      -> String
      -> Text
      -> Maybe Text
      -> NominalDiffTime
      -> Int
      -> AppConfig)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> KeyMap Value
o KeyMap Value -> Key -> Parser Int
forall a. FromJSON a => KeyMap Value -> Key -> Parser a
.: Key
"cacheMaxBytes"
        Parser
  (Int
   -> Int
   -> Int
   -> LogFormat
   -> TelemetrySwitch
   -> Maybe Url
   -> MinIntegrity
   -> MinTrustedIntegrity
   -> [IPRange]
   -> String
   -> Text
   -> Maybe Text
   -> NominalDiffTime
   -> Int
   -> AppConfig)
-> Parser Int
-> Parser
     (Int
      -> Int
      -> LogFormat
      -> TelemetrySwitch
      -> Maybe Url
      -> MinIntegrity
      -> MinTrustedIntegrity
      -> [IPRange]
      -> String
      -> Text
      -> Maybe Text
      -> NominalDiffTime
      -> Int
      -> AppConfig)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> KeyMap Value
o KeyMap Value -> Key -> Parser Int
forall a. FromJSON a => KeyMap Value -> Key -> Parser a
.: Key
"maxResponseBytes"
        Parser
  (Int
   -> Int
   -> LogFormat
   -> TelemetrySwitch
   -> Maybe Url
   -> MinIntegrity
   -> MinTrustedIntegrity
   -> [IPRange]
   -> String
   -> Text
   -> Maybe Text
   -> NominalDiffTime
   -> Int
   -> AppConfig)
-> Parser Int
-> Parser
     (Int
      -> LogFormat
      -> TelemetrySwitch
      -> Maybe Url
      -> MinIntegrity
      -> MinTrustedIntegrity
      -> [IPRange]
      -> String
      -> Text
      -> Maybe Text
      -> NominalDiffTime
      -> Int
      -> AppConfig)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> KeyMap Value
o KeyMap Value -> Key -> Parser Int
forall a. FromJSON a => KeyMap Value -> Key -> Parser a
.: Key
"maxVersionCount"
        Parser
  (Int
   -> LogFormat
   -> TelemetrySwitch
   -> Maybe Url
   -> MinIntegrity
   -> MinTrustedIntegrity
   -> [IPRange]
   -> String
   -> Text
   -> Maybe Text
   -> NominalDiffTime
   -> Int
   -> AppConfig)
-> Parser Int
-> Parser
     (LogFormat
      -> TelemetrySwitch
      -> Maybe Url
      -> MinIntegrity
      -> MinTrustedIntegrity
      -> [IPRange]
      -> String
      -> Text
      -> Maybe Text
      -> NominalDiffTime
      -> Int
      -> AppConfig)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> KeyMap Value
o KeyMap Value -> Key -> Parser Int
forall a. FromJSON a => KeyMap Value -> Key -> Parser a
.: Key
"maxNestingDepth"
        Parser
  (LogFormat
   -> TelemetrySwitch
   -> Maybe Url
   -> MinIntegrity
   -> MinTrustedIntegrity
   -> [IPRange]
   -> String
   -> Text
   -> Maybe Text
   -> NominalDiffTime
   -> Int
   -> AppConfig)
-> Parser LogFormat
-> Parser
     (TelemetrySwitch
      -> Maybe Url
      -> MinIntegrity
      -> MinTrustedIntegrity
      -> [IPRange]
      -> String
      -> Text
      -> Maybe Text
      -> NominalDiffTime
      -> Int
      -> AppConfig)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (KeyMap Value
o KeyMap Value -> Key -> Parser Value
forall a. FromJSON a => KeyMap Value -> Key -> Parser a
.: Key
"logFormat" Parser Value -> (Value -> Parser LogFormat) -> Parser LogFormat
forall a b. Parser a -> (a -> Parser b) -> Parser b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (Text -> Either Text LogFormat)
-> String -> Value -> Parser LogFormat
forall a. (Text -> Either Text a) -> String -> Value -> Parser a
parseEnum Text -> Either Text LogFormat
parseLogFormat String
"logFormat")
        Parser
  (TelemetrySwitch
   -> Maybe Url
   -> MinIntegrity
   -> MinTrustedIntegrity
   -> [IPRange]
   -> String
   -> Text
   -> Maybe Text
   -> NominalDiffTime
   -> Int
   -> AppConfig)
-> Parser TelemetrySwitch
-> Parser
     (Maybe Url
      -> MinIntegrity
      -> MinTrustedIntegrity
      -> [IPRange]
      -> String
      -> Text
      -> Maybe Text
      -> NominalDiffTime
      -> Int
      -> AppConfig)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (KeyMap Value
o KeyMap Value -> Key -> Parser Value
forall a. FromJSON a => KeyMap Value -> Key -> Parser a
.: Key
"telemetry" Parser Value
-> (Value -> Parser TelemetrySwitch) -> Parser TelemetrySwitch
forall a b. Parser a -> (a -> Parser b) -> Parser b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (Text -> Either Text TelemetrySwitch)
-> String -> Value -> Parser TelemetrySwitch
forall a. (Text -> Either Text a) -> String -> Value -> Parser a
parseEnum Text -> Either Text TelemetrySwitch
parseTelemetrySwitch String
"telemetry")
        Parser
  (Maybe Url
   -> MinIntegrity
   -> MinTrustedIntegrity
   -> [IPRange]
   -> String
   -> Text
   -> Maybe Text
   -> NominalDiffTime
   -> Int
   -> AppConfig)
-> Parser (Maybe Url)
-> Parser
     (MinIntegrity
      -> MinTrustedIntegrity
      -> [IPRange]
      -> String
      -> Text
      -> Maybe Text
      -> NominalDiffTime
      -> Int
      -> AppConfig)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (KeyMap Value
o KeyMap Value -> Key -> Parser (Maybe Value)
forall a. FromJSON a => KeyMap Value -> Key -> Parser (Maybe a)
.:? Key
"publicUrl" Parser (Maybe Value)
-> (Maybe Value -> Parser (Maybe Url)) -> Parser (Maybe Url)
forall a b. Parser a -> (a -> Parser b) -> Parser b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (Value -> Parser Url) -> Maybe Value -> Parser (Maybe Url)
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> Maybe a -> f (Maybe b)
traverse Value -> Parser Url
parseUrl)
        Parser
  (MinIntegrity
   -> MinTrustedIntegrity
   -> [IPRange]
   -> String
   -> Text
   -> Maybe Text
   -> NominalDiffTime
   -> Int
   -> AppConfig)
-> Parser MinIntegrity
-> Parser
     (MinTrustedIntegrity
      -> [IPRange]
      -> String
      -> Text
      -> Maybe Text
      -> NominalDiffTime
      -> Int
      -> AppConfig)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (KeyMap Value
o KeyMap Value -> Key -> Parser Value
forall a. FromJSON a => KeyMap Value -> Key -> Parser a
.: Key
"minPublicIntegrity" Parser Value
-> (Value -> Parser MinIntegrity) -> Parser MinIntegrity
forall a b. Parser a -> (a -> Parser b) -> Parser b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (Text -> Either Text MinIntegrity)
-> String -> Value -> Parser MinIntegrity
forall a. (Text -> Either Text a) -> String -> Value -> Parser a
parseEnum Text -> Either Text MinIntegrity
parseMinIntegrity String
"minPublicIntegrity")
        Parser
  (MinTrustedIntegrity
   -> [IPRange]
   -> String
   -> Text
   -> Maybe Text
   -> NominalDiffTime
   -> Int
   -> AppConfig)
-> Parser MinTrustedIntegrity
-> Parser
     ([IPRange]
      -> String
      -> Text
      -> Maybe Text
      -> NominalDiffTime
      -> Int
      -> AppConfig)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (KeyMap Value
o KeyMap Value -> Key -> Parser Value
forall a. FromJSON a => KeyMap Value -> Key -> Parser a
.: Key
"minTrustedIntegrity" Parser Value
-> (Value -> Parser MinTrustedIntegrity)
-> Parser MinTrustedIntegrity
forall a b. Parser a -> (a -> Parser b) -> Parser b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (Text -> Either Text MinTrustedIntegrity)
-> String -> Value -> Parser MinTrustedIntegrity
forall a. (Text -> Either Text a) -> String -> Value -> Parser a
parseEnum Text -> Either Text MinTrustedIntegrity
parseMinTrustedIntegrity String
"minTrustedIntegrity")
        Parser
  ([IPRange]
   -> String
   -> Text
   -> Maybe Text
   -> NominalDiffTime
   -> Int
   -> AppConfig)
-> Parser [IPRange]
-> Parser
     (String
      -> Text -> Maybe Text -> NominalDiffTime -> Int -> AppConfig)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (KeyMap Value
o KeyMap Value -> Key -> Parser (Maybe Value)
forall a. FromJSON a => KeyMap Value -> Key -> Parser (Maybe a)
.:? Key
"additionalBlockedRanges" Parser (Maybe Value) -> Value -> Parser Value
forall a. Parser (Maybe a) -> a -> Parser a
.!= Text -> Value
String Text
"" Parser Value -> (Value -> Parser [IPRange]) -> Parser [IPRange]
forall a b. Parser a -> (a -> Parser b) -> Parser b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Value -> Parser [IPRange]
parseAdditionalBlockedRanges)
        Parser
  (String
   -> Text -> Maybe Text -> NominalDiffTime -> Int -> AppConfig)
-> Parser String
-> Parser
     (Text -> Maybe Text -> NominalDiffTime -> Int -> AppConfig)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (KeyMap Value
o KeyMap Value -> Key -> Parser (Maybe String)
forall a. FromJSON a => KeyMap Value -> Key -> Parser (Maybe a)
.:? Key
"osvDataDir" Parser (Maybe String) -> String -> Parser String
forall a. Parser (Maybe a) -> a -> Parser a
.!= String
"data/osv")
        Parser (Text -> Maybe Text -> NominalDiffTime -> Int -> AppConfig)
-> Parser Text
-> Parser (Maybe Text -> NominalDiffTime -> Int -> AppConfig)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (KeyMap Value
o KeyMap Value -> Key -> Parser (Maybe Text)
forall a. FromJSON a => KeyMap Value -> Key -> Parser (Maybe a)
.:? Key
"osvExportBaseUrl" Parser (Maybe Text) -> Text -> Parser Text
forall a. Parser (Maybe a) -> a -> Parser a
.!= Text
"https://osv-vulnerabilities.storage.googleapis.com")
        Parser (Maybe Text -> NominalDiffTime -> Int -> AppConfig)
-> Parser (Maybe Text)
-> Parser (NominalDiffTime -> Int -> AppConfig)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> KeyMap Value
o KeyMap Value -> Key -> Parser (Maybe Text)
forall a. FromJSON a => KeyMap Value -> Key -> Parser (Maybe a)
.:? Key
"vulnerabilityDatabaseBucket"
        Parser (NominalDiffTime -> Int -> AppConfig)
-> Parser NominalDiffTime -> Parser (Int -> AppConfig)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (KeyMap Value
o KeyMap Value -> Key -> Parser Value
forall a. FromJSON a => KeyMap Value -> Key -> Parser a
.: Key
"cveDbPollInterval" Parser Value
-> (Value -> Parser NominalDiffTime) -> Parser NominalDiffTime
forall a b. Parser a -> (a -> Parser b) -> Parser b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= String -> Value -> Parser NominalDiffTime
parseDelaySeconds String
"cveDbPollInterval")
        Parser (Int -> AppConfig) -> Parser Int -> Parser AppConfig
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (KeyMap Value
o KeyMap Value -> Key -> Parser Int
forall a. FromJSON a => KeyMap Value -> Key -> Parser a
.: Key
"maxOsvDbBytes" Parser Int -> (Int -> Parser Int) -> Parser Int
forall a b. Parser a -> (a -> Parser b) -> Parser b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= String -> Int -> Parser Int
parsePositiveInt String
"maxOsvDbBytes")

acceptedDocumentKeys :: [Key.Key]
acceptedDocumentKeys :: [Key]
acceptedDocumentKeys =
    [ Key
"port"
    , Key
"mounts"
    , Key
"queueBackend"
    , Key
"queueUrl"
    , Key
"queueMemoryMaxDepth"
    , Key
"awsRegion"
    , Key
"awsEndpointUrlSqs"
    , Key
"awsEndpointUrl"
    , Key
"awsAccessKeyId"
    , Key
"awsSecretAccessKey"
    , Key
"googleProject"
    , Key
"authToken"
    , Key
"helpMessage"
    , Key
"cveSyncInterval"
    , Key
"shutdownDrainTimeout"
    , Key
"cores"
    , Key
"maxHeapBytes"
    , Key
"serveMaxInFlight"
    , Key
"publicConnectionsPerHost"
    , Key
"privateConnectionsPerHost"
    , Key
"cacheTtl"
    , Key
"cacheMaxEntries"
    , Key
"cacheMaxBytes"
    , Key
"maxResponseBytes"
    , Key
"maxVersionCount"
    , Key
"maxNestingDepth"
    , Key
"logFormat"
    , Key
"telemetry"
    , Key
"publicUrl"
    , Key
"minPublicIntegrity"
    , Key
"minTrustedIntegrity"
    , Key
"additionalBlockedRanges"
    , Key
"rules"
    , Key
"osvDataDir"
    , Key
"osvExportBaseUrl"
    , Key
"vulnerabilityDatabaseBucket"
    , Key
"cveDbPollInterval"
    , Key
"maxOsvDbBytes"
    ]

parseMounts :: KeyMap.KeyMap Value -> Parser (Map.Map Ecosystem MountConfig)
parseMounts :: KeyMap Value -> Parser (Map Ecosystem MountConfig)
parseMounts KeyMap Value
km = do
    mounts <- [(Ecosystem, MountConfig)] -> Map Ecosystem MountConfig
forall k a. Ord k => [(k, a)] -> Map k a
Map.fromList ([(Ecosystem, MountConfig)] -> Map Ecosystem MountConfig)
-> Parser [(Ecosystem, MountConfig)]
-> Parser (Map Ecosystem MountConfig)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ((Key, Value) -> Parser (Ecosystem, MountConfig))
-> [(Key, Value)] -> Parser [(Ecosystem, MountConfig)]
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> [a] -> f [b]
traverse (Key, Value) -> Parser (Ecosystem, MountConfig)
parseMountEntry (KeyMap Value -> [(Key, Value)]
forall v. KeyMap v -> [(Key, v)]
KeyMap.toList KeyMap Value
km)
    pure (Map.filter (isJust . mntPrivateUpstream) mounts)

parseMountEntry :: (Key.Key, Value) -> Parser (Ecosystem, MountConfig)
parseMountEntry :: (Key, Value) -> Parser (Ecosystem, MountConfig)
parseMountEntry (Key
k, Value
v) = do
    eco <- case Text -> Maybe Ecosystem
parseEcosystem (Key -> Text
Key.toText Key
k) of
        Just Ecosystem
e -> Ecosystem -> Parser Ecosystem
forall a. a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Ecosystem
e
        Maybe Ecosystem
Nothing -> String -> Parser Ecosystem
forall a. String -> Parser a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail (String
"Invalid ecosystem: " String -> String -> String
forall a. Semigroup a => a -> a -> a
<> Text -> String
T.unpack (Key -> Text
Key.toText Key
k))
    mcfg <- parseJSON v
    pure (eco, mcfg)

parseSecret :: Value -> Parser Secret
parseSecret :: Value -> Parser Secret
parseSecret = String -> (Text -> Parser Secret) -> Value -> Parser Secret
forall a. String -> (Text -> Parser a) -> Value -> Parser a
withText String
"Secret" (Secret -> Parser Secret
forall a. a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Secret -> Parser Secret)
-> (Text -> Secret) -> Text -> Parser Secret
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> Secret
mkSecret)

parseAdditionalBlockedRanges :: Value -> Parser [IPRange]
parseAdditionalBlockedRanges :: Value -> Parser [IPRange]
parseAdditionalBlockedRanges = String -> (Text -> Parser [IPRange]) -> Value -> Parser [IPRange]
forall a. String -> (Text -> Parser a) -> Value -> Parser a
withText String
"IPRange list" ((Text -> Parser [IPRange]) -> Value -> Parser [IPRange])
-> (Text -> Parser [IPRange]) -> Value -> Parser [IPRange]
forall a b. (a -> b) -> a -> b
$ \Text
t ->
    if Text -> Bool
T.null (Text -> Text
T.strip Text
t)
        then [IPRange] -> Parser [IPRange]
forall a. a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure []
        else (Text -> Parser IPRange) -> [Text] -> Parser [IPRange]
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> [a] -> f [b]
traverse Text -> Parser IPRange
parseBlockedRangeEntry (HasCallStack => Text -> Text -> [Text]
Text -> Text -> [Text]
T.splitOn Text
"," Text
t)

parseBlockedRangeEntry :: Text -> Parser IPRange
parseBlockedRangeEntry :: Text -> Parser IPRange
parseBlockedRangeEntry Text
entry =
    let trimmed :: Text
trimmed = Text -> Text
T.strip Text
entry
     in case Text -> Maybe IPRange
parseBlockedRange Text
trimmed of
            Just IPRange
range -> IPRange -> Parser IPRange
forall a. a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure IPRange
range
            Maybe IPRange
Nothing -> String -> Parser IPRange
forall a. String -> Parser a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail (String
"invalid CIDR range in additionalBlockedRanges: " String -> String -> String
forall a. Semigroup a => a -> a -> a
<> Text -> String
T.unpack Text
trimmed)

parseSeconds :: Value -> Parser NominalDiffTime
parseSeconds :: Value -> Parser NominalDiffTime
parseSeconds (String Text
t) = case String -> Maybe Integer
forall a. Read a => String -> Maybe a
readMaybe (Text -> String
T.unpack Text
t) :: Maybe Integer of
    Just Integer
n | Integer
n Integer -> Integer -> Bool
forall a. Ord a => a -> a -> Bool
>= Integer
0 -> NominalDiffTime -> Parser NominalDiffTime
forall a. a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Integer -> NominalDiffTime
forall a. Num a => Integer -> a
fromInteger Integer
n)
    Maybe Integer
_ -> String -> Parser NominalDiffTime
forall a. String -> Parser a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail (String
"expected a non-negative integer count of seconds, got " String -> String -> String
forall a. Semigroup a => a -> a -> a
<> Text -> String
forall b a. (Show a, IsString b) => a -> b
show Text
t)
parseSeconds (Number Scientific
n) =
    let val :: Integer
val = Scientific -> Integer
forall b. Integral b => Scientific -> b
forall a b. (RealFrac a, Integral b) => a -> b
truncate Scientific
n :: Integer
     in if Integer
val Integer -> Integer -> Bool
forall a. Ord a => a -> a -> Bool
>= Integer
0 then NominalDiffTime -> Parser NominalDiffTime
forall a. a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Integer -> NominalDiffTime
forall a. Num a => Integer -> a
fromInteger Integer
val) else String -> Parser NominalDiffTime
forall a. String -> Parser a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail String
"expected a non-negative integer count of seconds"
parseSeconds Value
_ = String -> Parser NominalDiffTime
forall a. String -> Parser a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail String
"expected a String or Number for Seconds"

parsePositiveInt :: String -> Int -> Parser Int
parsePositiveInt :: String -> Int -> Parser Int
parsePositiveInt String
field Int
value
    | Int
value Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
0 = Int -> Parser Int
forall a. a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Int
value
    | Bool
otherwise = String -> Parser Int
forall a. String -> Parser a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail (String
field String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
" must be a positive integer")

{- A recurring delay: positive (zero would spin the poll without
yielding) and bounded so its microsecond conversion fits 'Int'
rather than wrapping into an invalid negative delay.
-}
parseDelaySeconds :: String -> Value -> Parser NominalDiffTime
parseDelaySeconds :: String -> Value -> Parser NominalDiffTime
parseDelaySeconds String
field Value
v = do
    secs <- Value -> Parser NominalDiffTime
parseSeconds Value
v
    let n = NominalDiffTime -> Integer
forall b. Integral b => NominalDiffTime -> b
forall a b. (RealFrac a, Integral b) => a -> b
truncate NominalDiffTime
secs :: Integer
        maxDelay = Int -> Integer
forall a. Integral a => a -> Integer
toInteger (Int
forall a. Bounded a => a
maxBound :: Int) Integer -> Integer -> Integer
forall a. Integral a => a -> a -> a
`div` Integer
1_000_000
    if n >= 1 && n <= maxDelay
        then pure secs
        else fail (field <> " must be a positive integer count of seconds, at most " <> show maxDelay)

instance FromJSON RulePatch where
    parseJSON :: Value -> Parser RulePatch
parseJSON = String
-> (KeyMap Value -> Parser RulePatch) -> Value -> Parser RulePatch
forall a. String -> (KeyMap Value -> Parser a) -> Value -> Parser a
withObject String
"rules" ((KeyMap Value -> Parser RulePatch) -> Value -> Parser RulePatch)
-> (KeyMap Value -> Parser RulePatch) -> Value -> Parser RulePatch
forall a b. (a -> b) -> a -> b
$ \KeyMap Value
o ->
        Map Text RuleEntry -> RulePatch
RulePatch (Map Text RuleEntry -> RulePatch)
-> ([(Text, RuleEntry)] -> Map Text RuleEntry)
-> [(Text, RuleEntry)]
-> RulePatch
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [(Text, RuleEntry)] -> Map Text RuleEntry
forall k a. Ord k => [(k, a)] -> Map k a
Map.fromList ([(Text, RuleEntry)] -> RulePatch)
-> Parser [(Text, RuleEntry)] -> Parser RulePatch
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ((Key, Value) -> Parser (Text, RuleEntry))
-> [(Key, Value)] -> Parser [(Text, RuleEntry)]
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> [a] -> f [b]
traverse (Key, Value) -> Parser (Text, RuleEntry)
forall {a}. FromJSON a => (Key, Value) -> Parser (Text, a)
decodeEntry (KeyMap Value -> [(Key, Value)]
forall v. KeyMap v -> [(Key, v)]
KeyMap.toList KeyMap Value
o)
      where
        decodeEntry :: (Key, Value) -> Parser (Text, a)
decodeEntry (Key
k, Value
v) = (Key -> Text
Key.toText Key
k,) (a -> (Text, a)) -> Parser a -> Parser (Text, a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Value -> Parser a
forall a. FromJSON a => Value -> Parser a
parseJSON Value
v

instance FromJSON RuleEntry where
    parseJSON :: Value -> Parser RuleEntry
parseJSON = String
-> (KeyMap Value -> Parser RuleEntry) -> Value -> Parser RuleEntry
forall a. String -> (KeyMap Value -> Parser a) -> Value -> Parser a
withObject String
"rule" ((KeyMap Value -> Parser RuleEntry) -> Value -> Parser RuleEntry)
-> (KeyMap Value -> Parser RuleEntry) -> Value -> Parser RuleEntry
forall a b. (a -> b) -> a -> b
$ \KeyMap Value
o -> do
        KeyMap Value -> Parser ()
rejectSecretKeys KeyMap Value
o
        String -> [Key] -> KeyMap Value -> Parser ()
rejectUnknownKeys String
"rule" [Key
"type", Key
"precedence", Key
"enabled", Key
"ageSeconds", Key
"scope", Key
"identity"] KeyMap Value
o
        Maybe Text
-> Maybe Int
-> Maybe Bool
-> Maybe Integer
-> Maybe Text
-> Maybe Text
-> RuleEntry
RuleEntry
            (Maybe Text
 -> Maybe Int
 -> Maybe Bool
 -> Maybe Integer
 -> Maybe Text
 -> Maybe Text
 -> RuleEntry)
-> Parser (Maybe Text)
-> Parser
     (Maybe Int
      -> Maybe Bool
      -> Maybe Integer
      -> Maybe Text
      -> Maybe Text
      -> RuleEntry)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> KeyMap Value
o KeyMap Value -> Key -> Parser (Maybe Text)
forall a. FromJSON a => KeyMap Value -> Key -> Parser (Maybe a)
.:? Key
"type"
            Parser
  (Maybe Int
   -> Maybe Bool
   -> Maybe Integer
   -> Maybe Text
   -> Maybe Text
   -> RuleEntry)
-> Parser (Maybe Int)
-> Parser
     (Maybe Bool
      -> Maybe Integer -> Maybe Text -> Maybe Text -> RuleEntry)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> KeyMap Value
o KeyMap Value -> Key -> Parser (Maybe Int)
forall a. FromJSON a => KeyMap Value -> Key -> Parser (Maybe a)
.:? Key
"precedence"
            Parser
  (Maybe Bool
   -> Maybe Integer -> Maybe Text -> Maybe Text -> RuleEntry)
-> Parser (Maybe Bool)
-> Parser (Maybe Integer -> Maybe Text -> Maybe Text -> RuleEntry)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> KeyMap Value
o KeyMap Value -> Key -> Parser (Maybe Bool)
forall a. FromJSON a => KeyMap Value -> Key -> Parser (Maybe a)
.:? Key
"enabled"
            Parser (Maybe Integer -> Maybe Text -> Maybe Text -> RuleEntry)
-> Parser (Maybe Integer)
-> Parser (Maybe Text -> Maybe Text -> RuleEntry)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> KeyMap Value
o KeyMap Value -> Key -> Parser (Maybe Integer)
forall a. FromJSON a => KeyMap Value -> Key -> Parser (Maybe a)
.:? Key
"ageSeconds"
            Parser (Maybe Text -> Maybe Text -> RuleEntry)
-> Parser (Maybe Text) -> Parser (Maybe Text -> RuleEntry)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> KeyMap Value
o KeyMap Value -> Key -> Parser (Maybe Text)
forall a. FromJSON a => KeyMap Value -> Key -> Parser (Maybe a)
.:? Key
"scope"
            Parser (Maybe Text -> RuleEntry)
-> Parser (Maybe Text) -> Parser RuleEntry
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> KeyMap Value
o KeyMap Value -> Key -> Parser (Maybe Text)
forall a. FromJSON a => KeyMap Value -> Key -> Parser (Maybe a)
.:? Key
"identity"