-- |
-- Convert Haskell values to and from HTTP API data
-- such as URL pieces, headers and query parameters.
module Web.HttpApiData (
  -- * Examples
  -- $examples

  -- * Classes
  ToHttpApiData (..),
  FromHttpApiData (..),

  -- * @'Maybe'@ parsers
  parseUrlPieceMaybe,
  parseHeaderMaybe,
  parseQueryParamMaybe,

  -- * Prefix parsers
  parseUrlPieceWithPrefix,
  parseHeaderWithPrefix,
  parseQueryParamWithPrefix,

  -- * Multiple URL pieces
  toUrlPieces,
  parseUrlPieces,

  -- * Multiple query params
  toQueryParams,
  parseQueryParams,

  -- * Parsers for @'Bounded'@ @'Enum'@s
  parseBoundedUrlPiece,
  parseBoundedQueryParam,
  parseBoundedHeader,
  parseBoundedEnumOf,
  parseBoundedEnumOfI,
  parseBoundedTextData,

  -- * Lenient data
  LenientData (..),

  -- * Other helpers
  showTextData,
  readTextData,
) where

import           Web.Internal.HttpApiData

-- $setup
--
-- >>> :set -XOverloadedStrings
-- >>> import Control.Applicative
-- >>> import Data.Time.Compat
-- >>> import Data.Int
-- >>> import Data.Text (Text)
-- >>> import Data.Version

-- $examples
--
-- Booleans:
--
-- >>> toUrlPiece True
-- "true"
-- >>> parseUrlPiece "false" :: Either Text Bool
-- Right False
-- >>> parseUrlPieces ["true", "false", "undefined"] :: Either Text [Bool]
-- Left "could not parse: `undefined'"
--
-- Numbers:
--
-- >>> toQueryParam 45.2
-- "45.2"
-- >>> parseQueryParam "452" :: Either Text Int
-- Right 452
-- >>> toQueryParams [1..5] :: [Text]
-- ["1","2","3","4","5"]
-- >>> parseQueryParams ["127", "255"] :: Either Text [Int8]
-- Left "out of bounds: `255' (should be between -128 and 127)"
--
-- Strings:
--
-- >>> toHeader "hello"
-- "hello"
-- >>> parseHeader "world" :: Either Text String
-- Right "world"
--
-- Calendar day:
--
-- >>> toQueryParam (fromGregorian 2015 10 03)
-- "2015-10-03"
-- >>> toGregorian <$> parseQueryParam "2016-12-01"
-- Right (2016,12,1)