1{-# OPTIONS_GHC -Wall -fno-warn-unused-do-bind #-}
2{-# LANGUAGE BangPatterns, MagicHash, OverloadedStrings, UnboxedTuples #-}
6 -- re-export from Json.Decode.Internals
7 , Json.Decoder, Json.Error(..), Json.Type(..)
8 , Json.string, Json.text, Json.bool, Json.int
9 , Json.list, Json.dict, Json.pairs, Json.maybe
12 , Json.map, Json.map2, Json.mapError
13 , Json.succeed, Json.fail
14 , Json.andThen, Json.oneOf
19import Prelude hiding (length)
20import qualified Data.ByteString.Char8 as Char8
21import qualified Data.ByteString.Internal as B
22import qualified Data.HashMap.Strict as HashMap
23import qualified Data.Text as Text
24import qualified Data.Text.Encoding as Text
25import qualified Data.Vector as Vector
26import Foreign.ForeignPtr (ForeignPtr)
27import GHC.Word (Word8(..))
29import qualified Json.Decode.Internals as Json
30import qualified Parse.Primitives as P
31import qualified Parse.Primitives.Internals as I
32import Parse.Primitives.Internals (Parser(..), State(..), noError)
33import qualified Parse.Primitives.Keyword as Keyword
34import qualified Parse.Primitives.Number as Number
35import qualified Parse.Primitives.Symbol as Symbol
36import qualified Reporting.Error.Syntax as E
37import qualified Reporting.Region as R
46 | BadContent (Json.Error e)
49parse :: Json.Decoder e a -> B.ByteString -> Either (Failure e) a
50parse (Json.Decoder run) bytestring =
51 case P.run jsonFile bytestring of
68jsonFile :: Parser Json.Value
77jsonValue :: Parser Json.Value
79 do start <- P.getPosition
81 [ Json.String <$> string
85 , Keyword.jsonTrue >> return Json.TRUE
86 , Keyword.jsonFalse >> return Json.FALSE
87 , Keyword.jsonNull >> return Json.NULL
95object :: R.Position -> Parser Json.Value
98 P.inContext start E.ExprRecord $
104 , do Symbol.rightCurly
105 return (Json.Object [] HashMap.empty)
109objectHelp :: [(Text.Text, Json.Value)] -> Parser Json.Value
110objectHelp revEntries =
117 objectHelp (entry:revEntries)
120 return (Json.Object (reverse revEntries) (HashMap.fromList revEntries))
124field :: Parser (Text.Text, Json.Value)
138array :: R.Position -> Parser Json.Value
141 P.inContext start E.ExprList $
144 [ do entry <- jsonValue
147 , do Symbol.rightSquare
148 return (Json.Array Vector.empty)
152arrayHelp :: Int -> [Json.Value] -> Parser Json.Value
153arrayHelp !length revEntries =
160 arrayHelp (length + 1) (entry:revEntries)
162 do Symbol.rightSquare
163 return $ Json.Array $ Vector.reverse $
164 Vector.fromListN length revEntries
172number :: Parser Json.Value
174 Parser $ \(State fp offset terminal indent row col ctx) cok cerr _ eerr ->
175 if offset < terminal then
178 !word = I.unsafeIndex fp offset
179 !offset1 = offset + 1
181 if word <= 0x39 {- 9 -} && word >= 0x31 {- 1 -} then
182 case Number.chompInt fp offset1 terminal (fromIntegral (word - 0x30 {- 0 -})) of
183 Number.Err newOffset problem ->
184 cerr (E.ParseError row (col + (newOffset - offset)) problem)
186 Number.OkInt newOffset n ->
188 !newState = State fp newOffset terminal indent row (col + (newOffset - offset)) ctx
190 cok (Json.Integer n) newState noError
192 Number.OkFloat newOffset ->
194 !length = newOffset - offset
195 !scientific = read $ Char8.unpack $ B.PS fp offset length
196 !newState = State fp newOffset terminal indent row (col + length) ctx
198 cok (Json.Float scientific) newState noError
200 else if word == 0x30 {- 0 -} then
201 cok (Json.Integer 0) (State fp offset1 terminal indent row (col + 1) ctx) noError
215string :: Parser Text.Text
217 Parser $ \(State fp offset terminal indent row col ctx) cok cerr _ eerr ->
218 if offset < terminal && I.unsafeIndex fp offset == 0x22 {- " -} then
221 !offset1 = offset + 1
223 case stringHelp fp offset1 terminal row (col + 1) of
227 Ok newOffset newRow newCol ->
229 !newState = State fp newOffset terminal indent newRow newCol ctx
230 !content = Text.decodeUtf8 (B.PS fp offset1 (newOffset - offset1 - 1))
232 cok content newState noError
243stringHelp :: ForeignPtr Word8 -> Int -> Int -> Int -> Int -> StringResult
244stringHelp fp offset terminal row col =
245 if offset >= terminal then
246 Err (E.ParseError row col E.EndOfFile_String)
249 case I.unsafeIndex fp offset of
251 Ok (offset + 1) row (col + 1)
254 Err (E.ParseError row col E.NewLineInString)
258 !offset1 = offset + 1
260 if offset1 < terminal then
263 !word = I.unsafeIndex fp offset1
264 !newOffset = offset1 + I.getCharWidth fp offset1 terminal word
266 stringHelp fp newOffset terminal row (col + 2)
269 Err (E.ParseError (row + 1) col E.EndOfFile_String)
272 let !newOffset = offset + I.getCharWidth fp offset terminal word in
273 stringHelp fp newOffset terminal row (col + 1)
283 Parser $ \(State fp offset terminal indent row col ctx) cok _ _ _ ->
285 (# newOffset, newRow, newCol #) =
286 eatSpaces fp offset terminal row col
289 State fp newOffset terminal indent newRow newCol ctx
291 cok () newState noError
294eatSpaces :: ForeignPtr Word8 -> Int -> Int -> Int -> Int -> (# Int, Int, Int #)
295eatSpaces fp offset terminal row col =
296 if offset >= terminal then
297 (# offset, row, col #)
300 case I.unsafeIndex fp offset of
301 0x20 {- -} -> eatSpaces fp (offset + 1) terminal row (col + 1)
302 0x09 {- \t -} -> eatSpaces fp (offset + 1) terminal row (col + 1)
303 0x0A {- \n -} -> eatSpaces fp (offset + 1) terminal (row + 1) 1
304 0x0D {- \r -} -> eatSpaces fp (offset + 1) terminal row col
306 (# 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