forked from OSS/graphql
		
	Merge pull request #19 from jasonzoladz/master
Fix Int32 bounds checking in Value parser.
This commit is contained in:
		| @@ -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" | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user