Handle escaped quotes for GraphQL String Values
This also includes a new type for Value String. The tests fail now, although it parses successfully. I'll use a pretty printer in next commit so that it's easier to spot the differences. Onces this is working I'll add the rest of the escaped characters.
This commit is contained in:
		| @@ -66,12 +66,14 @@ data Value = ValueVariable Variable | ||||
|            -- GraphQL Float is double precison | ||||
|            | ValueFloat Double | ||||
|            | ValueBoolean Bool | ||||
|            | ValueString Text | ||||
|            | ValueString StringValue | ||||
|            | ValueEnum Name | ||||
|            | ValueList ListValue | ||||
|            | ValueObject ObjectValue | ||||
|              deriving (Eq,Show) | ||||
|  | ||||
| newtype StringValue = StringValue Text deriving (Eq,Show) | ||||
|  | ||||
| newtype ListValue = ListValue [Value] deriving (Eq,Show) | ||||
|  | ||||
| newtype ObjectValue = ObjectValue [ObjectField] deriving (Eq,Show) | ||||
|   | ||||
| @@ -14,6 +14,7 @@ import Data.Char | ||||
| import Data.Foldable (traverse_) | ||||
|  | ||||
| import Data.Text (Text, append) | ||||
| import qualified Data.Text as T | ||||
| import Data.Attoparsec.Text | ||||
|   ( Parser | ||||
|   , (<?>) | ||||
| @@ -28,6 +29,7 @@ import Data.Attoparsec.Text | ||||
|   , peekChar | ||||
|   , sepBy1 | ||||
|   , signed | ||||
|   , takeText | ||||
|   , takeWhile | ||||
|   , takeWhile1 | ||||
|   ) | ||||
| @@ -156,13 +158,23 @@ value = ValueVariable <$> variable | ||||
|     <|> ValueInt      <$> tok (signed decimal) | ||||
|     <|> ValueFloat    <$> tok (signed double) | ||||
|     <|> ValueBoolean  <$> bool | ||||
|     -- TODO: Handle escape characters, unicode, etc | ||||
|     <|> ValueString   <$> quotes name | ||||
|     <|> ValueString   <$> stringValue | ||||
|     -- `true` and `false` have been tried before | ||||
|     <|> ValueEnum     <$> name | ||||
|     <|> ValueList     <$> listValue | ||||
|     <|> ValueObject   <$> objectValue | ||||
|  | ||||
|  | ||||
| stringValue :: Parser StringValue | ||||
| stringValue = StringValue <$> quotes (T.foldl' step mempty <$> takeText) | ||||
|   where | ||||
|     -- TODO: Handle unicode and the rest of escaped chars. | ||||
|     step acc c | ||||
|         | T.null acc = T.singleton c | ||||
|         | T.last acc == '\\' = if c == '"' then T.init acc `T.snoc` '"' | ||||
|                                            else acc `T.snoc` c | ||||
|         | otherwise = acc `T.snoc` c | ||||
|  | ||||
| -- Notice it can be empty | ||||
| listValue :: Parser ListValue | ||||
| listValue = ListValue <$> brackets (many value) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user