module SocketActivation.Parsing where

import Control.Monad (Functor (fmap), Monad (return), (>=>))
import Data.Bits (toIntegralSized)
import Data.Function ((.))
import Data.Maybe (Maybe)
import Data.Text (Text)
import Foreign.C.Types (CInt)
import Numeric.Natural (Natural)
import Text.Read (readMaybe)

import qualified Data.Text as Text

import SocketActivation.Concepts

readRecipient :: Text -> Maybe Recipient
readRecipient :: Text -> Maybe Recipient
readRecipient = Text -> Maybe ProcessID
read forall (m :: * -> *) a b c.
Monad m =>
(a -> m b) -> (b -> m c) -> a -> m c
>=> ProcessID -> Maybe Recipient
wrap
  where
    read :: Text -> Maybe ProcessID
read = forall a. Read a => String -> Maybe a
readMaybe @ProcessID forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> String
Text.unpack
    wrap :: ProcessID -> Maybe Recipient
wrap = forall (m :: * -> *) a. Monad m => a -> m a
return forall b c a. (b -> c) -> (a -> b) -> a -> c
. ProcessID -> Recipient
RecipientPID

readCount :: Text -> Maybe Count
readCount :: Text -> Maybe Count
readCount = Text -> Maybe CInt
read forall (m :: * -> *) a b c.
Monad m =>
(a -> m b) -> (b -> m c) -> a -> m c
>=> CInt -> Maybe Natural
convert forall (m :: * -> *) a b c.
Monad m =>
(a -> m b) -> (b -> m c) -> a -> m c
>=> Natural -> Maybe Count
wrap
  where
    read :: Text -> Maybe CInt
read = forall a. Read a => String -> Maybe a
readMaybe @CInt forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> String
Text.unpack
    convert :: CInt -> Maybe Natural
convert = forall a b.
(Integral a, Integral b, Bits a, Bits b) =>
a -> Maybe b
toIntegralSized :: CInt -> Maybe Natural
    wrap :: Natural -> Maybe Count
wrap = forall (m :: * -> *) a. Monad m => a -> m a
return forall b c a. (b -> c) -> (a -> b) -> a -> c
. Natural -> Count
CountNat

readNames :: Text -> Names
readNames :: Text -> Names
readNames = [Name] -> Names
NamesList forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Text -> Name
NameText forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> Text -> [Text]
Text.splitOn Text
":"