module SocketActivation
    (
        {- * Actions -} getMySocketByName,
        {- * Types -} Name (..), VarName (..), Socket, Error (..),
    )
    where

import Essentials

import Data.Either (Either, either)
import System.IO (IO, print)

import qualified Control.Exception as Ex

import qualified SocketActivation.CheckRecipient as SA
import qualified SocketActivation.Env as SA
import qualified SocketActivation.GetByName as SA

import SocketActivation.Concepts
    (Socket, Error (..), VarName (..), Name (..))

getMySocketByName :: Name -> IO Socket
getMySocketByName :: Name -> IO Socket
getMySocketByName Name
name = IO (Either Error ()) -> IO ()
forall a. IO (Either Error a) -> IO a
f IO (Either Error ())
SA.checkRecipient IO () -> IO Socket -> IO Socket
forall a b. IO a -> IO b -> IO b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> IO (Either Error Socket) -> IO Socket
forall a. IO (Either Error a) -> IO a
f (Name -> IO (Either Error Socket)
SA.getSocketByName Name
name)
  where
    f :: IO (Either Error a) -> IO a
    f :: forall a. IO (Either Error a) -> IO a
f = (IO (Either Error a) -> (Either Error a -> IO a) -> IO a
forall a b. IO a -> (a -> IO b) -> IO b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (Error -> IO a) -> (a -> IO a) -> Either Error a -> IO a
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either (\Error
e -> (IO [(VarName, Maybe Text)]
SA.getEnvVars IO [(VarName, Maybe Text)]
-> ([(VarName, Maybe Text)] -> IO ()) -> IO ()
forall a b. IO a -> (a -> IO b) -> IO b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= [(VarName, Maybe Text)] -> IO ()
forall a. Show a => a -> IO ()
print) IO () -> IO a -> IO a
forall a b. IO a -> IO b -> IO b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Error -> IO a
forall a e. Exception e => e -> a
Ex.throw Error
e) a -> IO a
forall a. a -> IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure)