packages feed

natskell-0.3.0.0: internal/Types/Sub.hs

{-# LANGUAGE OverloadedStrings #-}

module Types.Sub where

import           Data.ByteString           (ByteString)
import qualified Data.ByteString.Lazy      as LBS
import           Transformers.Transformers (Transformer (..))
import           Types.Msg                 (SID, Subject)
import           Validators.Validators

data Sub = Sub
             { subject    :: Subject
             , queueGroup :: Maybe Subject
             , sid        :: SID
             }
  deriving (Eq, Show)

instance Transformer Sub where
  transform subMsg =
    case queueGroup subMsg of
      Just queue -> LBS.fromChunks ["SUB ", subject subMsg, " ", queue, " ", sid subMsg, "\r\n"]
      Nothing -> LBS.fromChunks ["SUB ", subject subMsg, " ", sid subMsg, "\r\n"]

instance Validator Sub where
  validate s = do
    validateSubject s
    validateQueueGroup s
    validateSid s

validateSubject :: Sub -> Either ByteString ()
validateSubject s
  | subject s == "" = Left "explicit empty subject"
  | otherwise = validateSubjectSyntax (subject s)

validateQueueGroup :: Sub -> Either ByteString ()
validateQueueGroup s
  | queueGroup s == Just "" = Left "explicit empty queue group"
  | otherwise = maybe (Right ()) validateQueueGroupSyntax (queueGroup s)

validateSid :: Sub -> Either ByteString ()
validateSid s
  | sid s == "" = Left "explicit empty sid"
  | otherwise = Right ()