mirror of
https://github.com/snoyberg/keter.git
synced 2024-12-14 08:05:40 +03:00
Added ToJSON instances
This commit is contained in:
parent
50334e503e
commit
c425181638
@ -2,11 +2,12 @@
|
|||||||
{-# LANGUAGE OverloadedStrings #-}
|
{-# LANGUAGE OverloadedStrings #-}
|
||||||
{-# LANGUAGE FlexibleContexts #-}
|
{-# LANGUAGE FlexibleContexts #-}
|
||||||
{-# LANGUAGE FlexibleInstances #-}
|
{-# LANGUAGE FlexibleInstances #-}
|
||||||
|
{-# LANGUAGE RecordWildCards #-}
|
||||||
module Keter.Types.V10 where
|
module Keter.Types.V10 where
|
||||||
|
|
||||||
import Prelude hiding (FilePath)
|
import Prelude hiding (FilePath)
|
||||||
import System.Posix.Types (EpochTime)
|
import System.Posix.Types (EpochTime)
|
||||||
import Data.Aeson (Object)
|
import Data.Aeson (Object, ToJSON (..))
|
||||||
import Keter.Types.Common
|
import Keter.Types.Common
|
||||||
import qualified Keter.Types.V04 as V04
|
import qualified Keter.Types.V04 as V04
|
||||||
import Data.Yaml.FilePath
|
import Data.Yaml.FilePath
|
||||||
@ -21,7 +22,7 @@ import Data.Vector (Vector)
|
|||||||
import qualified Data.Vector as V
|
import qualified Data.Vector as V
|
||||||
import Data.Monoid (mempty)
|
import Data.Monoid (mempty)
|
||||||
import Network.HTTP.ReverseProxy.Rewrite (ReverseProxyConfig)
|
import Network.HTTP.ReverseProxy.Rewrite (ReverseProxyConfig)
|
||||||
import Data.Maybe (fromMaybe)
|
import Data.Maybe (fromMaybe, catMaybes)
|
||||||
import qualified Network.Wai.Handler.Warp as Warp
|
import qualified Network.Wai.Handler.Warp as Warp
|
||||||
import qualified Network.Wai.Handler.WarpTLS as WarpTLS
|
import qualified Network.Wai.Handler.WarpTLS as WarpTLS
|
||||||
import qualified Data.HashMap.Strict as HashMap
|
import qualified Data.HashMap.Strict as HashMap
|
||||||
@ -49,14 +50,20 @@ instance ToCurrent BundleConfig where
|
|||||||
}
|
}
|
||||||
|
|
||||||
instance ParseYamlFile BundleConfig where
|
instance ParseYamlFile BundleConfig where
|
||||||
parseYamlFile basedir = withObject "Config" $ \o -> do
|
parseYamlFile basedir = withObject "BundleConfig" $ \o -> do
|
||||||
case HashMap.lookup "stanzas" o of
|
case HashMap.lookup "stanzas" o of
|
||||||
Nothing -> (toCurrent :: V04.BundleConfig -> BundleConfig) <$> parseYamlFile basedir (Object o)
|
Nothing -> (toCurrent :: V04.BundleConfig -> BundleConfig) <$> parseYamlFile basedir (Object o)
|
||||||
Just _ -> current o
|
Just _ -> current o
|
||||||
where
|
where
|
||||||
current o = BundleConfig
|
current o = BundleConfig
|
||||||
<$> lookupBase basedir o "stanzas"
|
<$> lookupBase basedir o "stanzas"
|
||||||
<*> pure o
|
<*> o .:? "plugins" .!= HashMap.empty
|
||||||
|
|
||||||
|
instance ToJSON BundleConfig where
|
||||||
|
toJSON BundleConfig {..} = object
|
||||||
|
[ "stanzas" .= bconfigStanzas
|
||||||
|
, "plugins" .= bconfigPlugins
|
||||||
|
]
|
||||||
|
|
||||||
data ListeningPort = LPSecure !HostPreference !Port !F.FilePath !F.FilePath
|
data ListeningPort = LPSecure !HostPreference !Port !F.FilePath !F.FilePath
|
||||||
| LPInsecure !HostPreference !Port
|
| LPInsecure !HostPreference !Port
|
||||||
@ -158,6 +165,18 @@ instance ParseYamlFile (Stanza ()) where
|
|||||||
"background" -> fmap StanzaBackground $ parseYamlFile basedir $ Object o
|
"background" -> fmap StanzaBackground $ parseYamlFile basedir $ Object o
|
||||||
_ -> fail $ "Unknown stanza type: " ++ typ
|
_ -> fail $ "Unknown stanza type: " ++ typ
|
||||||
|
|
||||||
|
instance ToJSON (Stanza ()) where
|
||||||
|
toJSON (StanzaStaticFiles x) = addStanzaType "static-files" x
|
||||||
|
toJSON (StanzaRedirect x) = addStanzaType "redirect" x
|
||||||
|
toJSON (StanzaWebApp x) = addStanzaType "webapp" x
|
||||||
|
toJSON (StanzaReverseProxy x) = addStanzaType "reverse-proxy" x
|
||||||
|
toJSON (StanzaBackground x) = addStanzaType "background" x
|
||||||
|
|
||||||
|
addStanzaType t x =
|
||||||
|
case toJSON x of
|
||||||
|
Object o -> Object $ HashMap.insert "type" t o
|
||||||
|
v -> v
|
||||||
|
|
||||||
data StaticFilesConfig = StaticFilesConfig
|
data StaticFilesConfig = StaticFilesConfig
|
||||||
{ sfconfigRoot :: !F.FilePath
|
{ sfconfigRoot :: !F.FilePath
|
||||||
, sfconfigHosts :: !(Set Host)
|
, sfconfigHosts :: !(Set Host)
|
||||||
@ -180,6 +199,13 @@ instance ParseYamlFile StaticFilesConfig where
|
|||||||
<*> (o .: "hosts" <|> (Set.singleton <$> (o .: "host")))
|
<*> (o .: "hosts" <|> (Set.singleton <$> (o .: "host")))
|
||||||
<*> o .:? "directory-listing" .!= False
|
<*> o .:? "directory-listing" .!= False
|
||||||
|
|
||||||
|
instance ToJSON StaticFilesConfig where
|
||||||
|
toJSON StaticFilesConfig {..} = object
|
||||||
|
[ "root" .= F.encodeString sfconfigRoot
|
||||||
|
, "hosts" .= sfconfigHosts
|
||||||
|
, "directory-listing" .= sfconfigListings
|
||||||
|
]
|
||||||
|
|
||||||
data RedirectConfig = RedirectConfig
|
data RedirectConfig = RedirectConfig
|
||||||
{ redirconfigHosts :: !(Set Host)
|
{ redirconfigHosts :: !(Set Host)
|
||||||
, redirconfigStatus :: !Int
|
, redirconfigStatus :: !Int
|
||||||
@ -202,6 +228,13 @@ instance ParseYamlFile RedirectConfig where
|
|||||||
<*> o .:? "status" .!= 303
|
<*> o .:? "status" .!= 303
|
||||||
<*> o .: "actions"
|
<*> o .: "actions"
|
||||||
|
|
||||||
|
instance ToJSON RedirectConfig where
|
||||||
|
toJSON RedirectConfig {..} = object
|
||||||
|
[ "hosts" .= redirconfigHosts
|
||||||
|
, "status" .= redirconfigStatus
|
||||||
|
, "actions" .= redirconfigActions
|
||||||
|
]
|
||||||
|
|
||||||
data RedirectAction = RedirectAction !SourcePath !RedirectDest
|
data RedirectAction = RedirectAction !SourcePath !RedirectDest
|
||||||
deriving Show
|
deriving Show
|
||||||
|
|
||||||
@ -210,6 +243,15 @@ instance FromJSON RedirectAction where
|
|||||||
<$> (maybe SPAny SPSpecific <$> (o .:? "path"))
|
<$> (maybe SPAny SPSpecific <$> (o .:? "path"))
|
||||||
<*> parseJSON (Object o)
|
<*> parseJSON (Object o)
|
||||||
|
|
||||||
|
instance ToJSON RedirectAction where
|
||||||
|
toJSON (RedirectAction path dest) =
|
||||||
|
case toJSON dest of
|
||||||
|
Object o ->
|
||||||
|
case path of
|
||||||
|
SPAny -> Object o
|
||||||
|
SPSpecific x -> Object $ HashMap.insert "path" (String x) o
|
||||||
|
v -> v
|
||||||
|
|
||||||
data SourcePath = SPAny
|
data SourcePath = SPAny
|
||||||
| SPSpecific !Text
|
| SPSpecific !Text
|
||||||
deriving Show
|
deriving Show
|
||||||
@ -226,7 +268,17 @@ instance FromJSON RedirectDest where
|
|||||||
prefix o = RDPrefix
|
prefix o = RDPrefix
|
||||||
<$> o .:? "secure" .!= False
|
<$> o .:? "secure" .!= False
|
||||||
<*> o .: "host"
|
<*> o .: "host"
|
||||||
<*> o .: "port"
|
<*> o .:? "port"
|
||||||
|
|
||||||
|
instance ToJSON RedirectDest where
|
||||||
|
toJSON (RDUrl url) = object ["url" .= url]
|
||||||
|
toJSON (RDPrefix secure host mport) = object $ catMaybes
|
||||||
|
[ Just $ "secure" .= secure
|
||||||
|
, Just $ "host" .= host
|
||||||
|
, case mport of
|
||||||
|
Nothing -> Nothing
|
||||||
|
Just port -> Just $ "port" .= port
|
||||||
|
]
|
||||||
|
|
||||||
type IsSecure = Bool
|
type IsSecure = Bool
|
||||||
|
|
||||||
@ -273,6 +325,15 @@ instance ParseYamlFile (WebAppConfig ()) where
|
|||||||
<*> o .:? "ssl" .!= False
|
<*> o .:? "ssl" .!= False
|
||||||
<*> return ()
|
<*> return ()
|
||||||
|
|
||||||
|
instance ToJSON (WebAppConfig ()) where
|
||||||
|
toJSON WebAppConfig {..} = object
|
||||||
|
[ "exec" .= F.encodeString waconfigExec
|
||||||
|
, "args" .= waconfigArgs
|
||||||
|
, "env" .= waconfigEnvironment
|
||||||
|
, "hosts" .= (waconfigApprootHost : Set.toList waconfigHosts)
|
||||||
|
, "ssl" .= waconfigSsl
|
||||||
|
]
|
||||||
|
|
||||||
data AppInput = AIBundle !FilePath !EpochTime
|
data AppInput = AIBundle !FilePath !EpochTime
|
||||||
| AIData !BundleConfig
|
| AIData !BundleConfig
|
||||||
|
|
||||||
@ -299,3 +360,14 @@ instance ParseYamlFile BackgroundConfig where
|
|||||||
<*> o .:? "env" .!= Map.empty
|
<*> o .:? "env" .!= Map.empty
|
||||||
<*> o .:? "restart-count" .!= UnlimitedRestarts
|
<*> o .:? "restart-count" .!= UnlimitedRestarts
|
||||||
<*> o .:? "restart-delay-seconds" .!= 5
|
<*> o .:? "restart-delay-seconds" .!= 5
|
||||||
|
|
||||||
|
instance ToJSON BackgroundConfig where
|
||||||
|
toJSON BackgroundConfig {..} = object $ catMaybes
|
||||||
|
[ Just $ "exec" .= F.encodeString bgconfigExec
|
||||||
|
, Just $ "args" .= bgconfigArgs
|
||||||
|
, Just $ "env" .= bgconfigEnvironment
|
||||||
|
, case bgconfigRestartCount of
|
||||||
|
UnlimitedRestarts -> Nothing
|
||||||
|
LimitedRestarts count -> Just $ "restart-count" .= count
|
||||||
|
, Just $ "restart-delay-seconds" .= bgconfigRestartDelaySeconds
|
||||||
|
]
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
{-# LANGUAGE OverloadedStrings #-}
|
{-# LANGUAGE OverloadedStrings #-}
|
||||||
|
{-# LANGUAGE RecordWildCards #-}
|
||||||
module Network.HTTP.ReverseProxy.Rewrite
|
module Network.HTTP.ReverseProxy.Rewrite
|
||||||
( ReverseProxyConfig (..)
|
( ReverseProxyConfig (..)
|
||||||
, RewriteRule (..)
|
, RewriteRule (..)
|
||||||
@ -164,6 +165,17 @@ instance FromJSON ReverseProxyConfig where
|
|||||||
<*> o .:? "rewrite-request" .!= Set.empty
|
<*> o .:? "rewrite-request" .!= Set.empty
|
||||||
parseJSON _ = fail "Wanted an object"
|
parseJSON _ = fail "Wanted an object"
|
||||||
|
|
||||||
|
instance ToJSON ReverseProxyConfig where
|
||||||
|
toJSON ReverseProxyConfig {..} = object
|
||||||
|
[ "reversed-host" .= reversedHost
|
||||||
|
, "reversed-port" .= reversedPort
|
||||||
|
, "reversing-host" .= reversingHost
|
||||||
|
, "ssl" .= reverseUseSSL
|
||||||
|
, "timeout" .= reverseTimeout
|
||||||
|
, "rewrite-response" .= rewriteResponseRules
|
||||||
|
, "rewrite-request" .= rewriteRequestRules
|
||||||
|
]
|
||||||
|
|
||||||
instance Default ReverseProxyConfig where
|
instance Default ReverseProxyConfig where
|
||||||
def = ReverseProxyConfig
|
def = ReverseProxyConfig
|
||||||
{ reversedHost = ""
|
{ reversedHost = ""
|
||||||
@ -187,3 +199,10 @@ instance FromJSON RewriteRule where
|
|||||||
<*> o .: "from"
|
<*> o .: "from"
|
||||||
<*> o .: "to"
|
<*> o .: "to"
|
||||||
parseJSON _ = fail "Wanted an object"
|
parseJSON _ = fail "Wanted an object"
|
||||||
|
|
||||||
|
instance ToJSON RewriteRule where
|
||||||
|
toJSON RewriteRule {..} = object
|
||||||
|
[ "header" .= ruleHeader
|
||||||
|
, "from" .= ruleRegex
|
||||||
|
, "to" .= ruleReplacement
|
||||||
|
]
|
||||||
|
Loading…
Reference in New Issue
Block a user