packages feed

jev-0.1.0.0: lib/Jev/Question.hs

-- | Pure question construction, validation, and fixture support.
module Jev.Question
  ( Question,
    choice,
    score,
    noul,
    noulWithCriteria,
    choiceJSON,
    scoreJSON,
    noulJSON,
    validateQuestion,
    PreparedRequest,
    prepareRequest,
    prepareRequestWith,
    requestBody,
    decodeResponse,
  )
where

import Data.Aeson (Value (String))
import Data.Text (Text)
import Jev.Internal.Protocol (PreparedRequest, Question, decodeResponse, prepareRequest, prepareRequestWith, requestBody, validateQuestion)
import Jev.Internal.Protocol qualified as Protocol
import Jev.Types

-- | Describe a choice with 1–255 options and unique wire labels.
-- Validation runs when prepared or sent; use 'validateQuestion' to check earlier.
choice :: Text -> [Option a] -> Question (Choice a)
choice instructions = choiceJSON (String instructions) . map (\(Option a label description) -> JsonOption a label (String <$> description))

-- | Rate on 2–10 ordered levels, starting at zero; returns a fractional expected score.
score :: Text -> [Text] -> Question Score
score instructions = scoreJSON (String instructions) . map String

-- | Ask a yes/no question; the answer is a probability, not a Boolean.
noul :: Text -> Question Noul
noul instructions = noulJSON (String instructions) Nothing

-- | Ask a yes/no question with explicit descriptions for both outcomes.
noulWithCriteria :: Text -> NoulCriteria Text -> Question Noul
noulWithCriteria instructions (NoulCriteria yes no) = noulJSON (String instructions) (Just (NoulCriteria (String yes) (String no)))

-- | Structured choice instructions and descriptions. Instructions accept strings,
-- objects, or arrays (also null for TypeSafe); descriptions may be null on either gateway.
choiceJSON :: Value -> [JsonOption a] -> Question (Choice a)
choiceJSON = Protocol.choiceQuestion

-- | Structured score instructions and 2–10 levels. Levels accept strings, objects,
-- or arrays, never null. Instructions may be null for TypeSafe only.
scoreJSON :: Value -> [Value] -> Question Score
scoreJSON = Protocol.scoreQuestion

-- | Structured yes/no instructions and optional outcome descriptions. Strings,
-- objects, and arrays are accepted; null is accepted for TypeSafe only.
noulJSON :: Value -> Maybe (NoulCriteria Value) -> Question Noul
noulJSON = Protocol.noulQuestion