packages feed

github-workflow-commands-0.0.0.0: library/GitHub/Workflow/Command/Syntax/Message.hs

module GitHub.Workflow.Command.Syntax.Message
  ( Message (..)
  , HasMessage (..)
  , FromMessage (..)
  ) where

import Control.Category
import Control.Lens (Lens', simple)
import Data.String (IsString)
import Data.Text (Text)
import Data.Text qualified as T
import Data.Text.Encoding qualified as T
import GitHub.Workflow.Command.Syntax.ToByteString
import Prelude (Eq, Ord, Show)

newtype Message = Message {text :: Text}
  deriving newtype (Eq, Ord, Show, IsString)

instance ToByteString Message where
  toByteStringBuilder =
    T.encodeUtf8Builder
      . T.concatMap
        ( \case
            '%' -> "%25"
            '\r' -> "%0D"
            '\n' -> "%0A"
            x -> T.singleton x
        )
      . (.text)

class HasMessage a where
  message :: Lens' a Message

instance HasMessage Message where
  message = simple

class FromMessage a where
  fromMessage :: Message -> a

instance FromMessage Message where
  fromMessage = id