module SocketActivation.GetByName where
import Essentials
import Control.Monad.IO.Class (MonadIO (liftIO))
import Data.Either (Either)
import Data.List (zip)
import Data.Map (Map)
import System.IO (IO)
import qualified Data.Map as Map
import SocketActivation.Concepts
(Socket, Fd, Error (NoSuchName), Names (namesList), Name)
import SocketActivation.Env (getEnv')
import SocketActivation.GetFileDescriptors (getFileDescriptorList)
import SocketActivation.GetSockets (getSocketList, fdSocket)
import SocketActivation.IO (IO' (IO', run), throwError)
getNameList :: IO (Either Error [Name])
getNameList = run $ IO' (getEnv' @Names) <&> namesList
getFileDescriptorMap :: IO (Either Error (Map Name Fd))
getFileDescriptorMap = run $ entries <&> Map.fromList
where
entries = zip <$> IO' getNameList <*> IO' getFileDescriptorList
getSocketMap :: IO (Either Error (Map Name Socket))
getSocketMap = run (entries <&> Map.fromList)
where
entries = zip <$> IO' getNameList <*> IO' getSocketList
getSocketByName :: Name -> IO (Either Error Socket)
getSocketByName name = run do
m <- IO' getFileDescriptorMap
fd <- case Map.lookup name m of
Nothing -> throwError (NoSuchName name (Map.keys m))
Just x -> pure x
liftIO $ fdSocket fd