1{-# OPTIONS_GHC -Wall -fno-warn-unused-do-bind #-}
2{-# LANGUAGE BangPatterns, MagicHash, OverloadedStrings, UnboxedTuples #-}
5 -- re-export from Json.Decode.Internals
6 , Json.Decoder, Json.Error(..)
7 , Json.string, Json.text, Json.bool, Json.int
8 , Json.list, Json.dict, Json.maybe
12 , Json.succeed, Json.fail
13 , Json.andThen, Json.oneOf
18import Prelude hiding (length)
19import qualified Data.ByteString.Internal as B
20import qualified Data.HashMap.Strict as HashMap
21import qualified Data.Text as Text
22import qualified Data.Text.Encoding as Text
23import qualified Data.Vector as Vector
24import Foreign.ForeignPtr (ForeignPtr)
25import GHC.Word (Word8(..))
27import qualified Json.Decode.Internals as Json
28import qualified Parse.Primitives as P
29import qualified Parse.Primitives.Internals as I
30import Parse.Primitives.Internals (Parser(..), State(..), noError)
31import qualified Parse.Primitives.Keyword as Keyword
32import qualified Parse.Primitives.Symbol as Symbol
33import qualified Reporting.Error.Syntax as E
34import qualified Reporting.Region as R
43 | BadContent (Json.Error e)
47parse :: Json.Decoder e a -> B.ByteString -> Result e a
48parse (Json.Decoder run) bytestring =
49 case P.run jsonFile bytestring of
66jsonFile :: Parser Json.Value
75jsonValue :: Parser Json.Value
77 do start <- P.getPosition
79 [ Json.String <$> string
83 , Keyword.jsonTrue >> return Json.TRUE
84 , Keyword.jsonFalse >> return Json.FALSE
85 , Keyword.jsonNull >> return Json.NULL
93object :: R.Position -> Parser Json.Value
96 P.inContext start E.ExprRecord $
102 , do Symbol.rightCurly
103 return (Json.Object [] HashMap.empty)
107objectHelp :: [(Text.Text, Json.Value)] -> Parser Json.Value
108objectHelp revEntries =
115 objectHelp (entry:revEntries)
118 return (Json.Object (reverse revEntries) (HashMap.fromList revEntries))
122field :: Parser (Text.Text, Json.Value)
136array :: R.Position -> Parser Json.Value
139 P.inContext start E.ExprList $
142 [ do entry <- jsonValue
145 , do Symbol.rightSquare
146 return (Json.Array Vector.empty)
150arrayHelp :: Int -> [Json.Value] -> Parser Json.Value
151arrayHelp !length revEntries =
158 arrayHelp (length + 1) (entry:revEntries)
160 do Symbol.rightSquare
161 return $ Json.Array $ Vector.reverse $
162 Vector.fromListN length revEntries
170number :: Parser Json.Value
179string :: Parser Text.Text
181 Parser $ \(State fp offset terminal indent row col ctx) cok cerr _ eerr ->
182 if offset < terminal && I.unsafeIndex fp offset == 0x22 {- " -} then
184 case stringHelp fp (offset + 1) terminal row (col + 1) of
188 Ok newOffset newRow newCol ->
190 !newState = State fp newOffset terminal indent newRow newCol ctx
191 !content = Text.decodeUtf8 (B.PS fp offset (newOffset - offset))
193 cok content newState noError
204stringHelp :: ForeignPtr Word8 -> Int -> Int -> Int -> Int -> StringResult
205stringHelp fp offset terminal row col =
206 if offset >= terminal then
207 Err (E.ParseError row col E.EndOfFile_String)
210 case I.unsafeIndex fp offset of
212 Ok (offset + 1) row (col + 1)
215 Err (E.ParseError row col E.NewLineInString)
219 !offset1 = offset + 1
221 if offset1 < terminal then
224 !word = I.unsafeIndex fp offset1
225 !newOffset = offset1 + I.getCharWidth fp offset1 terminal word
227 stringHelp fp newOffset terminal row (col + 2)
230 Err (E.ParseError (row + 1) col E.EndOfFile_String)
233 let !newOffset = offset + I.getCharWidth fp offset terminal word in
234 stringHelp fp newOffset terminal row (col + 1)
244 Parser $ \(State fp offset terminal indent row col ctx) cok _ _ _ ->
246 (# newOffset, newRow, newCol #) =
247 eatSpaces fp offset terminal row col
250 State fp newOffset terminal indent newRow newCol ctx
252 cok () newState noError
255eatSpaces :: ForeignPtr Word8 -> Int -> Int -> Int -> Int -> (# Int, Int, Int #)
256eatSpaces fp offset terminal row col =
257 if offset >= terminal then
258 (# offset, row, col #)
261 case I.unsafeIndex fp offset of
262 0x20 {- -} -> eatSpaces fp (offset + 1) terminal row (col + 1)
263 0x09 {- \t -} -> eatSpaces fp (offset + 1) terminal row (col + 1)
264 0x0A {- \n -} -> eatSpaces fp (offset + 1) terminal (row + 1) 1
265 0x0D {- \r -} -> eatSpaces fp (offset + 1) terminal row col
267 (# offset, row, col #)
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list