ecluse:ecluse-core
Safe HaskellNone
LanguageGHC2021

Ecluse.Core.Registry.Json.Walk

Description

A resumable walk over the vendored json-stream lexer's tokens, and its body-bounded driver. Each primitive keeps the acceptance of the json-stream combinator it stands in for: which strings and keys are decoded, which malformed input is skipped, and where a read fails. The lexer's own leniency passes through unchanged. It reads : and , as whitespace, reads a lone -, . or -. within a piece as 0 but fails one at a piece's end, and wraps an exponent past Int, so 1e18446744073709551617 reads as 10. A walk returns a pure Step, or a step in ST when it writes as it reads.

Synopsis

Driving a walk

data Steps (m :: Type -> Type) s Source #

A read in progress: it needs input, stops on a parse error or a refused value, or has finished. A read that writes as it goes resumes in its own effect.

Constructors

NeedData (ByteString -> m (Steps m s)) 
Failed Text 
Refused LimitError 
Finished s 

Instances

Instances details
Build (Writer st) (ST st (Steps (ST st) s)) Source #

A value the writer holds in its scratch, which a read passes on as a mark only. Each step runs out of line, so a read's continuations hold the writer as one pointer.

Instance details

Defined in Ecluse.Core.Registry.Json.Writer

Associated Types

type Built (Writer st) 
Instance details

Defined in Ecluse.Core.Registry.Json.Writer

type Built (Writer st) = ()
type Fields (Writer st) 
Instance details

Defined in Ecluse.Core.Registry.Json.Writer

type Fields (Writer st) = Frame
type Items (Writer st) 
Instance details

Defined in Ecluse.Core.Registry.Json.Writer

type Items (Writer st) = Int

Methods

sharedString :: Writer st -> Entry -> (Built (Writer st) -> ST st (Steps (ST st) s)) -> ST st (Steps (ST st) s) Source #

ownString :: Writer st -> Name -> (Built (Writer st) -> ST st (Steps (ST st) s)) -> ST st (Steps (ST st) s) Source #

integer :: Writer st -> Int -> (Built (Writer st) -> ST st (Steps (ST st) s)) -> ST st (Steps (ST st) s) Source #

whole :: Writer st -> Value -> (Built (Writer st) -> ST st (Steps (ST st) s)) -> ST st (Steps (ST st) s) Source #

emptyContainer :: Writer st -> (Built (Writer st) -> ST st (Steps (ST st) s)) -> ST st (Steps (ST st) s) Source #

openObject :: Writer st -> (Fields (Writer st) -> ST st (Steps (ST st) s)) -> ST st (Steps (ST st) s) Source #

beginMember :: Writer st -> MemberKey -> Fields (Writer st) -> (Bool -> ST st (Steps (ST st) s)) -> ST st (Steps (ST st) s) Source #

addMember :: Writer st -> MemberKey -> Built (Writer st) -> Fields (Writer st) -> (Fields (Writer st) -> ST st (Steps (ST st) s)) -> ST st (Steps (ST st) s) Source #

dropValue :: Writer st -> Built (Writer st) -> ST st (Steps (ST st) s) -> ST st (Steps (ST st) s) Source #

closeObject :: Writer st -> Fields (Writer st) -> (Built (Writer st) -> ST st (Steps (ST st) s)) -> ST st (Steps (ST st) s) Source #

openArray :: Writer st -> (Items (Writer st) -> ST st (Steps (ST st) s)) -> ST st (Steps (ST st) s) Source #

addItem :: Writer st -> Built (Writer st) -> Items (Writer st) -> (Items (Writer st) -> ST st (Steps (ST st) s)) -> ST st (Steps (ST st) s) Source #

closeArray :: Writer st -> Int -> Items (Writer st) -> (Built (Writer st) -> ST st (Steps (ST st) s)) -> ST st (Steps (ST st) s) Source #

Walk (Steps Identity s) Source # 
Instance details

Defined in Ecluse.Core.Registry.Json.Walk

Associated Types

type Result (Steps Identity s) 
Instance details

Defined in Ecluse.Core.Registry.Json.Walk

type Result (Steps Identity s) = s
Walk (ST st (Steps (ST st) s)) Source # 
Instance details

Defined in Ecluse.Core.Registry.Json.Walk

Associated Types

type Result (ST st (Steps (ST st) s)) 
Instance details

Defined in Ecluse.Core.Registry.Json.Walk

type Result (ST st (Steps (ST st) s)) = s

Methods

needData :: (ByteString -> ST st (Steps (ST st) s)) -> ST st (Steps (ST st) s) Source #

failWith :: Text -> ST st (Steps (ST st) s) Source #

refuse :: LimitError -> ST st (Steps (ST st) s) Source #

finish :: Result (ST st (Steps (ST st) s)) -> ST st (Steps (ST st) s) Source #

type Result (Steps Identity s) Source # 
Instance details

Defined in Ecluse.Core.Registry.Json.Walk

type Result (Steps Identity s) = s
type Result (ST st (Steps (ST st) s)) Source # 
Instance details

Defined in Ecluse.Core.Registry.Json.Walk

type Result (ST st (Steps (ST st) s)) = s

type Step = Steps Identity Source #

A read with no effect of its own.

class Walk r where Source #

What a walk's continuations return: a read that needs input, has failed or been refused, or is done.

Associated Types

type Result r Source #

What a finished walk returns.

Methods

needData :: (ByteString -> r) -> r Source #

Suspend until the next chunk of input.

failWith :: Text -> r Source #

Stop on a parse error.

refuse :: LimitError -> r Source #

Stop on a refused field.

finish :: Result r -> r Source #

Finish with the walk's result.

Instances

Instances details
Walk (Steps Identity s) Source # 
Instance details

Defined in Ecluse.Core.Registry.Json.Walk

Associated Types

type Result (Steps Identity s) 
Instance details

Defined in Ecluse.Core.Registry.Json.Walk

type Result (Steps Identity s) = s
Walk (ST st (Steps (ST st) s)) Source # 
Instance details

Defined in Ecluse.Core.Registry.Json.Walk

Associated Types

type Result (ST st (Steps (ST st) s)) 
Instance details

Defined in Ecluse.Core.Registry.Json.Walk

type Result (ST st (Steps (ST st) s)) = s

Methods

needData :: (ByteString -> ST st (Steps (ST st) s)) -> ST st (Steps (ST st) s) Source #

failWith :: Text -> ST st (Steps (ST st) s) Source #

refuse :: LimitError -> ST st (Steps (ST st) s) Source #

finish :: Result (ST st (Steps (ST st) s)) -> ST st (Steps (ST st) s) Source #

readJsonWalk :: Monad m => BodyLimit -> (TokenResult -> Step s) -> m ByteString -> m (Either LimitError (StreamResult s)) Source #

Walk a body as readJsonStream reads one, from the lexer's first token.

readJsonWalkST :: Monad m => (forall a. ST st a -> m a) -> BodyLimit -> (TokenResult -> ST st (Steps (ST st) s)) -> m ByteString -> m (Either LimitError (StreamResult s)) Source #

readJsonWalk for a walk that writes in ST as it reads, run in the reader's effect.

nestingLimit :: Text Source #

The parse error that marks a retained value past its structural budget.

data Walked s Source #

A walk's state between tokens: the read's table and the consumer's accumulator.

Constructors

Walked !InternTable s 

type FieldStep s field r = s -> field -> (Either LimitError s -> r) -> r Source #

How a consumer takes each field: it continues with its next state, or refuses the field.

pureStep :: (s -> field -> Either LimitError s) -> FieldStep s field r Source #

A consumer that takes each field without an effect of its own.

emit :: Walk r => FieldStep s field r -> s -> field -> (s -> r) -> r Source #

Pass a field to the consumer's step. A refused field ends the walk.

Tokens

withElement :: Walk r => TokenResult -> (Element -> TokenResult -> r) -> r Source #

The next element, suspending for input at a chunk boundary. The continuation runs once.

skipFrom :: Walk r => Element -> TokenResult -> (TokenResult -> r) -> r Source #

Skip the value starting at the element without decoding it, as json-stream's ignoreVal does.

skipRest :: Walk r => Int -> TokenResult -> (TokenResult -> r) -> r Source #

Skip to the end of the container the given number of levels up. Any closing token closes a level.

tooDeep :: Walk r => Element -> TokenResult -> r Source #

Skip the value, then fail: a retained value with no structural budget left.

isString :: Element -> Bool Source #

Whether the element starts a string.

readString :: Walk r => Element -> TokenResult -> (Name -> TokenResult -> r) -> r Source #

Decode the string starting at the element, failing where json-stream's string fails.

eachMember :: Walk r => (st -> Name -> TokenResult -> (st -> TokenResult -> r) -> r) -> (st -> TokenResult -> r) -> st -> TokenResult -> r Source #

Visit each member of an object whose opening brace was read, as json-stream's objectKeyValues does: every key is decoded, and a key longer than 64 KiB across pieces drops its member unread.

memberName :: Walk r => Element -> TokenResult -> (Name -> TokenResult -> r) -> (TokenResult -> r) -> r Source #

Decode the object key at the element, or skip its member when json-stream drops it unread.

eachItem :: Walk r => (st -> Int -> Element -> TokenResult -> (st -> TokenResult -> r) -> r) -> (st -> TokenResult -> r) -> st -> TokenResult -> r Source #

Visit each item of an array whose opening bracket was read, with its position.