{-# LANGUAGE GeneralisedNewtypeDeriving #-}
{-# LANGUAGE RecordWildCards            #-}
{-# LANGUAGE TemplateHaskell            #-}

module Striot.Nodes.Types where

import           Control.Lens                             ((^.))
import           Control.Lens.Combinators                 (makeClassy)
import           Control.Lens.TH
import           Control.Monad.Reader
import           Data.IORef
import           Network.Socket                           (HostName,
                                                           ServiceName)
import           System.Envy
import           System.Metrics.Prometheus.Metric.Counter (Counter)
import           System.Metrics.Prometheus.Metric.Gauge   (Gauge)


data Metrics = Metrics
    { Metrics -> Gauge
_ingressConn   :: Gauge
    , Metrics -> Counter
_ingressBytes  :: Counter
    , Metrics -> Counter
_ingressEvents :: Counter
    , Metrics -> Gauge
_egressConn    :: Gauge
    , Metrics -> Counter
_egressBytes   :: Counter
    , Metrics -> Counter
_egressEvents  :: Counter
    }

data NetConfig = NetConfig
    { NetConfig -> HostName
_host :: HostName
    , NetConfig -> HostName
_port :: ServiceName
    } deriving (Int -> NetConfig -> ShowS
[NetConfig] -> ShowS
NetConfig -> HostName
(Int -> NetConfig -> ShowS)
-> (NetConfig -> HostName)
-> ([NetConfig] -> ShowS)
-> Show NetConfig
forall a.
(Int -> a -> ShowS) -> (a -> HostName) -> ([a] -> ShowS) -> Show a
showList :: [NetConfig] -> ShowS
$cshowList :: [NetConfig] -> ShowS
show :: NetConfig -> HostName
$cshow :: NetConfig -> HostName
showsPrec :: Int -> NetConfig -> ShowS
$cshowsPrec :: Int -> NetConfig -> ShowS
Show)
makeLenses ''NetConfig

data TCPConfig = TCPConfig
    { TCPConfig -> NetConfig
_tcpConn :: NetConfig
    } deriving (Int -> TCPConfig -> ShowS
[TCPConfig] -> ShowS
TCPConfig -> HostName
(Int -> TCPConfig -> ShowS)
-> (TCPConfig -> HostName)
-> ([TCPConfig] -> ShowS)
-> Show TCPConfig
forall a.
(Int -> a -> ShowS) -> (a -> HostName) -> ([a] -> ShowS) -> Show a
showList :: [TCPConfig] -> ShowS
$cshowList :: [TCPConfig] -> ShowS
show :: TCPConfig -> HostName
$cshow :: TCPConfig -> HostName
showsPrec :: Int -> TCPConfig -> ShowS
$cshowsPrec :: Int -> TCPConfig -> ShowS
Show)
makeLenses ''TCPConfig

data KafkaConfig = KafkaConfig
    { KafkaConfig -> NetConfig
_kafkaConn     :: NetConfig
    , KafkaConfig -> HostName
_kafkaTopic    :: String
    , KafkaConfig -> HostName
_kafkaConGroup :: String
    } deriving (Int -> KafkaConfig -> ShowS
[KafkaConfig] -> ShowS
KafkaConfig -> HostName
(Int -> KafkaConfig -> ShowS)
-> (KafkaConfig -> HostName)
-> ([KafkaConfig] -> ShowS)
-> Show KafkaConfig
forall a.
(Int -> a -> ShowS) -> (a -> HostName) -> ([a] -> ShowS) -> Show a
showList :: [KafkaConfig] -> ShowS
$cshowList :: [KafkaConfig] -> ShowS
show :: KafkaConfig -> HostName
$cshow :: KafkaConfig -> HostName
showsPrec :: Int -> KafkaConfig -> ShowS
$cshowsPrec :: Int -> KafkaConfig -> ShowS
Show)
makeLenses ''KafkaConfig

data MQTTConfig = MQTTConfig
    { MQTTConfig -> NetConfig
_mqttConn  :: NetConfig
    , MQTTConfig -> HostName
_mqttTopic :: String
    } deriving (Int -> MQTTConfig -> ShowS
[MQTTConfig] -> ShowS
MQTTConfig -> HostName
(Int -> MQTTConfig -> ShowS)
-> (MQTTConfig -> HostName)
-> ([MQTTConfig] -> ShowS)
-> Show MQTTConfig
forall a.
(Int -> a -> ShowS) -> (a -> HostName) -> ([a] -> ShowS) -> Show a
showList :: [MQTTConfig] -> ShowS
$cshowList :: [MQTTConfig] -> ShowS
show :: MQTTConfig -> HostName
$cshow :: MQTTConfig -> HostName
showsPrec :: Int -> MQTTConfig -> ShowS
$cshowsPrec :: Int -> MQTTConfig -> ShowS
Show)
makeLenses ''MQTTConfig

data ConnectionConfig = ConnTCPConfig TCPConfig
                      | ConnKafkaConfig KafkaConfig
                      | ConnMQTTConfig MQTTConfig
                      deriving (Int -> ConnectionConfig -> ShowS
[ConnectionConfig] -> ShowS
ConnectionConfig -> HostName
(Int -> ConnectionConfig -> ShowS)
-> (ConnectionConfig -> HostName)
-> ([ConnectionConfig] -> ShowS)
-> Show ConnectionConfig
forall a.
(Int -> a -> ShowS) -> (a -> HostName) -> ([a] -> ShowS) -> Show a
showList :: [ConnectionConfig] -> ShowS
$cshowList :: [ConnectionConfig] -> ShowS
show :: ConnectionConfig -> HostName
$cshow :: ConnectionConfig -> HostName
showsPrec :: Int -> ConnectionConfig -> ShowS
$cshowsPrec :: Int -> ConnectionConfig -> ShowS
Show)

data StriotConfig = StriotConfig
    { StriotConfig -> HostName
_nodeName          :: String
    , StriotConfig -> ConnectionConfig
_ingressConnConfig :: ConnectionConfig
    , StriotConfig -> ConnectionConfig
_egressConnConfig  :: ConnectionConfig
    , StriotConfig -> Int
_chanSize          :: Int
    } deriving (Int -> StriotConfig -> ShowS
[StriotConfig] -> ShowS
StriotConfig -> HostName
(Int -> StriotConfig -> ShowS)
-> (StriotConfig -> HostName)
-> ([StriotConfig] -> ShowS)
-> Show StriotConfig
forall a.
(Int -> a -> ShowS) -> (a -> HostName) -> ([a] -> ShowS) -> Show a
showList :: [StriotConfig] -> ShowS
$cshowList :: [StriotConfig] -> ShowS
show :: StriotConfig -> HostName
$cshow :: StriotConfig -> HostName
showsPrec :: Int -> StriotConfig -> ShowS
$cshowsPrec :: Int -> StriotConfig -> ShowS
Show)
makeClassy ''StriotConfig

instance ToEnv StriotConfig where
    toEnv :: StriotConfig -> EnvList StriotConfig
toEnv StriotConfig {Int
HostName
ConnectionConfig
_chanSize :: Int
_egressConnConfig :: ConnectionConfig
_ingressConnConfig :: ConnectionConfig
_nodeName :: HostName
_chanSize :: StriotConfig -> Int
_egressConnConfig :: StriotConfig -> ConnectionConfig
_ingressConnConfig :: StriotConfig -> ConnectionConfig
_nodeName :: StriotConfig -> HostName
..} =
        [EnvVar] -> EnvList StriotConfig
forall a. [EnvVar] -> EnvList a
makeEnv ([EnvVar] -> EnvList StriotConfig)
-> [EnvVar] -> EnvList StriotConfig
forall a b. (a -> b) -> a -> b
$
            [ HostName
"STRIOT_NODE_NAME" HostName -> HostName -> EnvVar
forall a. Var a => HostName -> a -> EnvVar
.= HostName
_nodeName
            , HostName
"STRIOT_CHAN_SIZE" HostName -> Int -> EnvVar
forall a. Var a => HostName -> a -> EnvVar
.= Int
_chanSize
            ] [EnvVar] -> [EnvVar] -> [EnvVar]
forall a. [a] -> [a] -> [a]
++ ConnectType -> ConnectionConfig -> [EnvVar]
writeConf ConnectType
INGRESS ConnectionConfig
_ingressConnConfig
              [EnvVar] -> [EnvVar] -> [EnvVar]
forall a. [a] -> [a] -> [a]
++ ConnectType -> ConnectionConfig -> [EnvVar]
writeConf ConnectType
EGRESS  ConnectionConfig
_egressConnConfig

writeConf :: ConnectType -> ConnectionConfig -> [EnvVar]
writeConf :: ConnectType -> ConnectionConfig -> [EnvVar]
writeConf ConnectType
t (ConnTCPConfig   TCPConfig
conf) =
    let base :: HostName
base = HostName
"STRIOT_" HostName -> ShowS
forall a. [a] -> [a] -> [a]
++ ConnectType -> HostName
forall a. Show a => a -> HostName
show ConnectType
t HostName -> ShowS
forall a. [a] -> [a] -> [a]
++ HostName
"_"
    in  [ (HostName
base HostName -> ShowS
forall a. [a] -> [a] -> [a]
++ HostName
"TYPE") HostName -> HostName -> EnvVar
forall a. Var a => HostName -> a -> EnvVar
.= HostName
"TCP"
        , (HostName
base HostName -> ShowS
forall a. [a] -> [a] -> [a]
++ HostName
"HOST") HostName -> HostName -> EnvVar
forall a. Var a => HostName -> a -> EnvVar
.= (TCPConfig
conf TCPConfig -> Getting HostName TCPConfig HostName -> HostName
forall s a. s -> Getting a s a -> a
^. (NetConfig -> Const HostName NetConfig)
-> TCPConfig -> Const HostName TCPConfig
Iso' TCPConfig NetConfig
tcpConn ((NetConfig -> Const HostName NetConfig)
 -> TCPConfig -> Const HostName TCPConfig)
-> ((HostName -> Const HostName HostName)
    -> NetConfig -> Const HostName NetConfig)
-> Getting HostName TCPConfig HostName
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (HostName -> Const HostName HostName)
-> NetConfig -> Const HostName NetConfig
Lens' NetConfig HostName
host)
        , (HostName
base HostName -> ShowS
forall a. [a] -> [a] -> [a]
++ HostName
"PORT") HostName -> HostName -> EnvVar
forall a. Var a => HostName -> a -> EnvVar
.= (TCPConfig
conf TCPConfig -> Getting HostName TCPConfig HostName -> HostName
forall s a. s -> Getting a s a -> a
^. (NetConfig -> Const HostName NetConfig)
-> TCPConfig -> Const HostName TCPConfig
Iso' TCPConfig NetConfig
tcpConn ((NetConfig -> Const HostName NetConfig)
 -> TCPConfig -> Const HostName TCPConfig)
-> ((HostName -> Const HostName HostName)
    -> NetConfig -> Const HostName NetConfig)
-> Getting HostName TCPConfig HostName
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (HostName -> Const HostName HostName)
-> NetConfig -> Const HostName NetConfig
Lens' NetConfig HostName
port)]
writeConf ConnectType
t (ConnKafkaConfig KafkaConfig
conf) =
    let base :: HostName
base = HostName
"STRIOT_" HostName -> ShowS
forall a. [a] -> [a] -> [a]
++ ConnectType -> HostName
forall a. Show a => a -> HostName
show ConnectType
t HostName -> ShowS
forall a. [a] -> [a] -> [a]
++ HostName
"_"
    in  [ (HostName
base HostName -> ShowS
forall a. [a] -> [a] -> [a]
++ HostName
"TYPE")            HostName -> HostName -> EnvVar
forall a. Var a => HostName -> a -> EnvVar
.= HostName
"KAFKA"
        , (HostName
base HostName -> ShowS
forall a. [a] -> [a] -> [a]
++ HostName
"HOST")            HostName -> HostName -> EnvVar
forall a. Var a => HostName -> a -> EnvVar
.= (KafkaConfig
conf KafkaConfig -> Getting HostName KafkaConfig HostName -> HostName
forall s a. s -> Getting a s a -> a
^. (NetConfig -> Const HostName NetConfig)
-> KafkaConfig -> Const HostName KafkaConfig
Lens' KafkaConfig NetConfig
kafkaConn ((NetConfig -> Const HostName NetConfig)
 -> KafkaConfig -> Const HostName KafkaConfig)
-> ((HostName -> Const HostName HostName)
    -> NetConfig -> Const HostName NetConfig)
-> Getting HostName KafkaConfig HostName
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (HostName -> Const HostName HostName)
-> NetConfig -> Const HostName NetConfig
Lens' NetConfig HostName
host)
        , (HostName
base HostName -> ShowS
forall a. [a] -> [a] -> [a]
++ HostName
"PORT")            HostName -> HostName -> EnvVar
forall a. Var a => HostName -> a -> EnvVar
.= (KafkaConfig
conf KafkaConfig -> Getting HostName KafkaConfig HostName -> HostName
forall s a. s -> Getting a s a -> a
^. (NetConfig -> Const HostName NetConfig)
-> KafkaConfig -> Const HostName KafkaConfig
Lens' KafkaConfig NetConfig
kafkaConn ((NetConfig -> Const HostName NetConfig)
 -> KafkaConfig -> Const HostName KafkaConfig)
-> ((HostName -> Const HostName HostName)
    -> NetConfig -> Const HostName NetConfig)
-> Getting HostName KafkaConfig HostName
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (HostName -> Const HostName HostName)
-> NetConfig -> Const HostName NetConfig
Lens' NetConfig HostName
port)
        , (HostName
base HostName -> ShowS
forall a. [a] -> [a] -> [a]
++ HostName
"KAFKA_TOPIC")     HostName -> HostName -> EnvVar
forall a. Var a => HostName -> a -> EnvVar
.= (KafkaConfig
conf KafkaConfig -> Getting HostName KafkaConfig HostName -> HostName
forall s a. s -> Getting a s a -> a
^. Getting HostName KafkaConfig HostName
Lens' KafkaConfig HostName
kafkaTopic)
        , (HostName
base HostName -> ShowS
forall a. [a] -> [a] -> [a]
++ HostName
"KAFKA_CON_GROUP") HostName -> HostName -> EnvVar
forall a. Var a => HostName -> a -> EnvVar
.= (KafkaConfig
conf KafkaConfig -> Getting HostName KafkaConfig HostName -> HostName
forall s a. s -> Getting a s a -> a
^. Getting HostName KafkaConfig HostName
Lens' KafkaConfig HostName
kafkaConGroup)]
writeConf ConnectType
t (ConnMQTTConfig  MQTTConfig
conf) =
    let base :: HostName
base = HostName
"STRIOT_" HostName -> ShowS
forall a. [a] -> [a] -> [a]
++ ConnectType -> HostName
forall a. Show a => a -> HostName
show ConnectType
t HostName -> ShowS
forall a. [a] -> [a] -> [a]
++ HostName
"_"
    in  [ (HostName
base HostName -> ShowS
forall a. [a] -> [a] -> [a]
++ HostName
"TYPE")       HostName -> HostName -> EnvVar
forall a. Var a => HostName -> a -> EnvVar
.= HostName
"MQTT"
        , (HostName
base HostName -> ShowS
forall a. [a] -> [a] -> [a]
++ HostName
"HOST")       HostName -> HostName -> EnvVar
forall a. Var a => HostName -> a -> EnvVar
.= (MQTTConfig
conf MQTTConfig -> Getting HostName MQTTConfig HostName -> HostName
forall s a. s -> Getting a s a -> a
^. (NetConfig -> Const HostName NetConfig)
-> MQTTConfig -> Const HostName MQTTConfig
Lens' MQTTConfig NetConfig
mqttConn ((NetConfig -> Const HostName NetConfig)
 -> MQTTConfig -> Const HostName MQTTConfig)
-> ((HostName -> Const HostName HostName)
    -> NetConfig -> Const HostName NetConfig)
-> Getting HostName MQTTConfig HostName
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (HostName -> Const HostName HostName)
-> NetConfig -> Const HostName NetConfig
Lens' NetConfig HostName
host)
        , (HostName
base HostName -> ShowS
forall a. [a] -> [a] -> [a]
++ HostName
"PORT")       HostName -> HostName -> EnvVar
forall a. Var a => HostName -> a -> EnvVar
.= (MQTTConfig
conf MQTTConfig -> Getting HostName MQTTConfig HostName -> HostName
forall s a. s -> Getting a s a -> a
^. (NetConfig -> Const HostName NetConfig)
-> MQTTConfig -> Const HostName MQTTConfig
Lens' MQTTConfig NetConfig
mqttConn ((NetConfig -> Const HostName NetConfig)
 -> MQTTConfig -> Const HostName MQTTConfig)
-> ((HostName -> Const HostName HostName)
    -> NetConfig -> Const HostName NetConfig)
-> Getting HostName MQTTConfig HostName
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (HostName -> Const HostName HostName)
-> NetConfig -> Const HostName NetConfig
Lens' NetConfig HostName
port)
        , (HostName
base HostName -> ShowS
forall a. [a] -> [a] -> [a]
++ HostName
"MQTT_TOPIC") HostName -> HostName -> EnvVar
forall a. Var a => HostName -> a -> EnvVar
.= (MQTTConfig
conf MQTTConfig -> Getting HostName MQTTConfig HostName -> HostName
forall s a. s -> Getting a s a -> a
^. Getting HostName MQTTConfig HostName
Lens' MQTTConfig HostName
mqttTopic)]

instance FromEnv StriotConfig where
    fromEnv :: Maybe StriotConfig -> Parser StriotConfig
fromEnv Maybe StriotConfig
_ = HostName
-> ConnectionConfig -> ConnectionConfig -> Int -> StriotConfig
StriotConfig
            (HostName
 -> ConnectionConfig -> ConnectionConfig -> Int -> StriotConfig)
-> Parser HostName
-> Parser
     (ConnectionConfig -> ConnectionConfig -> Int -> StriotConfig)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HostName -> Parser (Maybe HostName)
forall a. Var a => HostName -> Parser (Maybe a)
envMaybe HostName
"STRIOT_NODE_NAME" Parser (Maybe HostName) -> HostName -> Parser HostName
forall a. Parser (Maybe a) -> a -> Parser a
.!= HostName
"striot"
            Parser
  (ConnectionConfig -> ConnectionConfig -> Int -> StriotConfig)
-> Parser ConnectionConfig
-> Parser (ConnectionConfig -> Int -> StriotConfig)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ConnectType -> Parser ConnectionConfig
readConf ConnectType
INGRESS
            Parser (ConnectionConfig -> Int -> StriotConfig)
-> Parser ConnectionConfig -> Parser (Int -> StriotConfig)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ConnectType -> Parser ConnectionConfig
readConf ConnectType
EGRESS
            Parser (Int -> StriotConfig) -> Parser Int -> Parser StriotConfig
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> HostName -> Parser (Maybe Int)
forall a. Var a => HostName -> Parser (Maybe a)
envMaybe HostName
"STRIOT_CHAN_SIZE" Parser (Maybe Int) -> Int -> Parser Int
forall a. Parser (Maybe a) -> a -> Parser a
.!= Int
10

readConf :: ConnectType -> Parser ConnectionConfig
readConf :: ConnectType -> Parser ConnectionConfig
readConf ConnectType
t = do
    let base :: HostName
base = HostName
"STRIOT_" HostName -> ShowS
forall a. [a] -> [a] -> [a]
++ ConnectType -> HostName
forall a. Show a => a -> HostName
show ConnectType
t HostName -> ShowS
forall a. [a] -> [a] -> [a]
++ HostName
"_"
    HostName
p <- HostName -> Parser HostName
forall a. Var a => HostName -> Parser a
env (HostName
base HostName -> ShowS
forall a. [a] -> [a] -> [a]
++ HostName
"TYPE")
    case HostName
p of
        HostName
"TCP"   -> TCPConfig -> ConnectionConfig
ConnTCPConfig
                    (TCPConfig -> ConnectionConfig)
-> Parser TCPConfig -> Parser ConnectionConfig
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (NetConfig -> TCPConfig
TCPConfig
                            (NetConfig -> TCPConfig) -> Parser NetConfig -> Parser TCPConfig
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HostName -> Parser NetConfig
nc HostName
base)
        HostName
"KAFKA" -> KafkaConfig -> ConnectionConfig
ConnKafkaConfig
                    (KafkaConfig -> ConnectionConfig)
-> Parser KafkaConfig -> Parser ConnectionConfig
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (NetConfig -> HostName -> HostName -> KafkaConfig
KafkaConfig
                        (NetConfig -> HostName -> HostName -> KafkaConfig)
-> Parser NetConfig -> Parser (HostName -> HostName -> KafkaConfig)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HostName -> Parser NetConfig
nc HostName
base
                        Parser (HostName -> HostName -> KafkaConfig)
-> Parser HostName -> Parser (HostName -> KafkaConfig)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> HostName -> Parser HostName
forall a. Var a => HostName -> Parser a
env (HostName
base HostName -> ShowS
forall a. [a] -> [a] -> [a]
++ HostName
"KAFKA_TOPIC")
                        Parser (HostName -> KafkaConfig)
-> Parser HostName -> Parser KafkaConfig
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> HostName -> Parser HostName
forall a. Var a => HostName -> Parser a
env (HostName
base HostName -> ShowS
forall a. [a] -> [a] -> [a]
++ HostName
"KAFKA_CON_GROUP"))
        HostName
"MQTT"  -> MQTTConfig -> ConnectionConfig
ConnMQTTConfig
                    (MQTTConfig -> ConnectionConfig)
-> Parser MQTTConfig -> Parser ConnectionConfig
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (NetConfig -> HostName -> MQTTConfig
MQTTConfig
                        (NetConfig -> HostName -> MQTTConfig)
-> Parser NetConfig -> Parser (HostName -> MQTTConfig)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HostName -> Parser NetConfig
nc HostName
base
                        Parser (HostName -> MQTTConfig)
-> Parser HostName -> Parser MQTTConfig
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> HostName -> Parser HostName
forall a. Var a => HostName -> Parser a
env (HostName
base HostName -> ShowS
forall a. [a] -> [a] -> [a]
++ HostName
"MQTT_TOPIC"))

nc :: String -> Parser NetConfig
nc :: HostName -> Parser NetConfig
nc HostName
base = HostName -> HostName -> NetConfig
NetConfig
        (HostName -> HostName -> NetConfig)
-> Parser HostName -> Parser (HostName -> NetConfig)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HostName -> Parser HostName
forall a. Var a => HostName -> Parser a
env (HostName
base HostName -> ShowS
forall a. [a] -> [a] -> [a]
++ HostName
"HOST")
        Parser (HostName -> NetConfig)
-> Parser HostName -> Parser NetConfig
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> HostName -> Parser HostName
forall a. Var a => HostName -> Parser a
env (HostName
base HostName -> ShowS
forall a. [a] -> [a] -> [a]
++ HostName
"PORT")

newtype StriotApp a =
    StriotApp {
        forall a. StriotApp a -> ReaderT StriotConfig IO a
unApp :: ReaderT StriotConfig IO a
    } deriving (
        (forall a b. (a -> b) -> StriotApp a -> StriotApp b)
-> (forall a b. a -> StriotApp b -> StriotApp a)
-> Functor StriotApp
forall a b. a -> StriotApp b -> StriotApp a
forall a b. (a -> b) -> StriotApp a -> StriotApp b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
<$ :: forall a b. a -> StriotApp b -> StriotApp a
$c<$ :: forall a b. a -> StriotApp b -> StriotApp a
fmap :: forall a b. (a -> b) -> StriotApp a -> StriotApp b
$cfmap :: forall a b. (a -> b) -> StriotApp a -> StriotApp b
Functor,
        Functor StriotApp
Functor StriotApp
-> (forall a. a -> StriotApp a)
-> (forall a b. StriotApp (a -> b) -> StriotApp a -> StriotApp b)
-> (forall a b c.
    (a -> b -> c) -> StriotApp a -> StriotApp b -> StriotApp c)
-> (forall a b. StriotApp a -> StriotApp b -> StriotApp b)
-> (forall a b. StriotApp a -> StriotApp b -> StriotApp a)
-> Applicative StriotApp
forall a. a -> StriotApp a
forall a b. StriotApp a -> StriotApp b -> StriotApp a
forall a b. StriotApp a -> StriotApp b -> StriotApp b
forall a b. StriotApp (a -> b) -> StriotApp a -> StriotApp b
forall a b c.
(a -> b -> c) -> StriotApp a -> StriotApp b -> StriotApp c
forall (f :: * -> *).
Functor f
-> (forall a. a -> f a)
-> (forall a b. f (a -> b) -> f a -> f b)
-> (forall a b c. (a -> b -> c) -> f a -> f b -> f c)
-> (forall a b. f a -> f b -> f b)
-> (forall a b. f a -> f b -> f a)
-> Applicative f
<* :: forall a b. StriotApp a -> StriotApp b -> StriotApp a
$c<* :: forall a b. StriotApp a -> StriotApp b -> StriotApp a
*> :: forall a b. StriotApp a -> StriotApp b -> StriotApp b
$c*> :: forall a b. StriotApp a -> StriotApp b -> StriotApp b
liftA2 :: forall a b c.
(a -> b -> c) -> StriotApp a -> StriotApp b -> StriotApp c
$cliftA2 :: forall a b c.
(a -> b -> c) -> StriotApp a -> StriotApp b -> StriotApp c
<*> :: forall a b. StriotApp (a -> b) -> StriotApp a -> StriotApp b
$c<*> :: forall a b. StriotApp (a -> b) -> StriotApp a -> StriotApp b
pure :: forall a. a -> StriotApp a
$cpure :: forall a. a -> StriotApp a
Applicative,
        Applicative StriotApp
Applicative StriotApp
-> (forall a b. StriotApp a -> (a -> StriotApp b) -> StriotApp b)
-> (forall a b. StriotApp a -> StriotApp b -> StriotApp b)
-> (forall a. a -> StriotApp a)
-> Monad StriotApp
forall a. a -> StriotApp a
forall a b. StriotApp a -> StriotApp b -> StriotApp b
forall a b. StriotApp a -> (a -> StriotApp b) -> StriotApp b
forall (m :: * -> *).
Applicative m
-> (forall a b. m a -> (a -> m b) -> m b)
-> (forall a b. m a -> m b -> m b)
-> (forall a. a -> m a)
-> Monad m
return :: forall a. a -> StriotApp a
$creturn :: forall a. a -> StriotApp a
>> :: forall a b. StriotApp a -> StriotApp b -> StriotApp b
$c>> :: forall a b. StriotApp a -> StriotApp b -> StriotApp b
>>= :: forall a b. StriotApp a -> (a -> StriotApp b) -> StriotApp b
$c>>= :: forall a b. StriotApp a -> (a -> StriotApp b) -> StriotApp b
Monad,
        MonadReader StriotConfig,
        Monad StriotApp
Monad StriotApp
-> (forall a. IO a -> StriotApp a) -> MonadIO StriotApp
forall a. IO a -> StriotApp a
forall (m :: * -> *).
Monad m -> (forall a. IO a -> m a) -> MonadIO m
liftIO :: forall a. IO a -> StriotApp a
$cliftIO :: forall a. IO a -> StriotApp a
MonadIO
    )

data ConnectType = INGRESS
                 | EGRESS
                 deriving (Int -> ConnectType -> ShowS
[ConnectType] -> ShowS
ConnectType -> HostName
(Int -> ConnectType -> ShowS)
-> (ConnectType -> HostName)
-> ([ConnectType] -> ShowS)
-> Show ConnectType
forall a.
(Int -> a -> ShowS) -> (a -> HostName) -> ([a] -> ShowS) -> Show a
showList :: [ConnectType] -> ShowS
$cshowList :: [ConnectType] -> ShowS
show :: ConnectType -> HostName
$cshow :: ConnectType -> HostName
showsPrec :: Int -> ConnectType -> ShowS
$cshowsPrec :: Int -> ConnectType -> ShowS
Show)

data ConnectProtocol = TCP
                     | KAFKA
                     | MQTT