forked from OSS/graphql
Merge pull request #19 from jasonzoladz/master
Fix Int32 bounds checking in Value parser.
This commit is contained in:
commit
642eab312f
@ -8,6 +8,7 @@ import Control.Applicative ((<|>), empty, many, optional)
|
|||||||
import Control.Monad (when)
|
import Control.Monad (when)
|
||||||
import Data.Char (isDigit, isSpace)
|
import Data.Char (isDigit, isSpace)
|
||||||
import Data.Foldable (traverse_)
|
import Data.Foldable (traverse_)
|
||||||
|
import Data.Int (Int32)
|
||||||
import Data.Scientific (floatingOrInteger)
|
import Data.Scientific (floatingOrInteger)
|
||||||
|
|
||||||
import Data.Text (Text, append)
|
import Data.Text (Text, append)
|
||||||
@ -147,7 +148,7 @@ typeCondition = namedType
|
|||||||
value :: Parser Value
|
value :: Parser Value
|
||||||
value = ValueVariable <$> variable
|
value = ValueVariable <$> variable
|
||||||
-- TODO: Handle maxBound, Int32 in spec.
|
-- TODO: Handle maxBound, Int32 in spec.
|
||||||
<|> tok (either ValueFloat ValueInt . floatingOrInteger <$> scientific)
|
<|> tok floatOrInt32Value
|
||||||
<|> ValueBoolean <$> booleanValue
|
<|> ValueBoolean <$> booleanValue
|
||||||
<|> ValueString <$> stringValue
|
<|> ValueString <$> stringValue
|
||||||
-- `true` and `false` have been tried before
|
-- `true` and `false` have been tried before
|
||||||
@ -156,6 +157,16 @@ value = ValueVariable <$> variable
|
|||||||
<|> ValueObject <$> objectValue
|
<|> ValueObject <$> objectValue
|
||||||
<?> "value error!"
|
<?> "value error!"
|
||||||
|
|
||||||
|
floatOrInt32Value :: Parser Value
|
||||||
|
floatOrInt32Value = do
|
||||||
|
n <- scientific
|
||||||
|
case (floatingOrInteger n :: Either Double Integer) of
|
||||||
|
Left dbl -> return $ ValueFloat dbl
|
||||||
|
Right i ->
|
||||||
|
if i < (-2147483648) || i >= 2147483648
|
||||||
|
then fail "Integer value is out of range."
|
||||||
|
else return $ ValueInt (fromIntegral i :: Int32)
|
||||||
|
|
||||||
booleanValue :: Parser Bool
|
booleanValue :: Parser Bool
|
||||||
booleanValue = True <$ tok "true"
|
booleanValue = True <$ tok "true"
|
||||||
<|> False <$ tok "false"
|
<|> False <$ tok "false"
|
||||||
|
Loading…
Reference in New Issue
Block a user