tahoe-chk-0.1.0.2: src/Tahoe/CHK/Parsing.hs
module Tahoe.CHK.Parsing where
import qualified Data.Set as Set
import Text.Megaparsec (ErrorFancy (ErrorFail), MonadParsec, fancyFailure)
-- | Parse an integral with lower and upper value constraints.
bounded ::
(MonadParsec e s m, Ord n, Integral n) =>
-- | A parser for an arbitrarily large integral value.
m Integer ->
-- | The smallest allowed value.
n ->
-- | The largest allowed value.
n ->
-- | A parser that succeeds only for integers within the given bounds.
m n
bounded decimal low high = do
-- Parse into an integer so there's no wrap-around
v <- decimal
if v < fromIntegral low
then fancyFailure (Set.singleton (ErrorFail "below minimum allowed value"))
else
if v > fromIntegral high
then fancyFailure (Set.singleton (ErrorFail "above maximum allowed value"))
else pure (fromIntegral v)