packages feed

scrod-0.2026.2.21: source/library/Scrod/Executable/Format.hs

{-# LANGUAGE TemplateHaskellQuotes #-}

-- | Output format selection (@html@ or @json@).
module Scrod.Executable.Format where

import qualified Control.Monad.Catch as Exception
import qualified GHC.Stack as Stack
import qualified Scrod.Spec as Spec

data Format
  = Html
  | Json
  deriving (Eq, Ord, Show)

fromString :: (Stack.HasCallStack, Exception.MonadThrow m) => String -> m Format
fromString string = case string of
  "html" -> pure Html
  "json" -> pure Json
  _ -> Exception.throwM . userError $ "invalid format: " <> show string

spec :: (Applicative m, Monad n) => Spec.Spec m n -> n ()
spec s = do
  Spec.named s 'fromString $ do
    Spec.it s "parses html" $ do
      Spec.assertEq s (fromString "html") $ Just Html

    Spec.it s "parses json" $ do
      Spec.assertEq s (fromString "json") $ Just Json

    Spec.it s "fails with invalid input" $ do
      Spec.assertEq s (fromString "invalid") Nothing