| Safe Haskell | None |
|---|---|
| Language | GHC2021 |
Ecluse.Core.Registry.Json.Walk
Contents
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
- data Steps (m :: Type -> Type) s
- = NeedData (ByteString -> m (Steps m s))
- | Failed Text
- | Refused LimitError
- | Finished s
- type Step = Steps Identity
- class Walk r where
- type Result r
- needData :: (ByteString -> r) -> r
- failWith :: Text -> r
- refuse :: LimitError -> r
- finish :: Result r -> r
- readJsonWalk :: Monad m => BodyLimit -> (TokenResult -> Step s) -> m ByteString -> m (Either LimitError (StreamResult s))
- 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))
- nestingLimit :: Text
- data Walked s = Walked !InternTable s
- type FieldStep s field r = s -> field -> (Either LimitError s -> r) -> r
- pureStep :: (s -> field -> Either LimitError s) -> FieldStep s field r
- emit :: Walk r => FieldStep s field r -> s -> field -> (s -> r) -> r
- withElement :: Walk r => TokenResult -> (Element -> TokenResult -> r) -> r
- skipFrom :: Walk r => Element -> TokenResult -> (TokenResult -> r) -> r
- skipRest :: Walk r => Int -> TokenResult -> (TokenResult -> r) -> r
- tooDeep :: Walk r => Element -> TokenResult -> r
- isString :: Element -> Bool
- readString :: Walk r => Element -> TokenResult -> (Name -> TokenResult -> r) -> r
- eachMember :: Walk r => (st -> Name -> TokenResult -> (st -> TokenResult -> r) -> r) -> (st -> TokenResult -> r) -> st -> TokenResult -> r
- memberName :: Walk r => Element -> TokenResult -> (Name -> TokenResult -> r) -> (TokenResult -> r) -> r
- eachItem :: Walk r => (st -> Int -> Element -> TokenResult -> (st -> TokenResult -> r) -> r) -> (st -> TokenResult -> r) -> st -> TokenResult -> r
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
| 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. | ||||||||||||
Defined in Ecluse.Core.Registry.Json.Writer Associated Types
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 # | |||||||||||||
Defined in Ecluse.Core.Registry.Json.Walk Associated Types
| |||||||||||||
| Walk (ST st (Steps (ST st) s)) Source # | |||||||||||||
Defined in Ecluse.Core.Registry.Json.Walk Associated Types
| |||||||||||||
| type Result (Steps Identity s) Source # | |||||||||||||
Defined in Ecluse.Core.Registry.Json.Walk | |||||||||||||
| type Result (ST st (Steps (ST st) s)) Source # | |||||||||||||
Defined in Ecluse.Core.Registry.Json.Walk | |||||||||||||
What a walk's continuations return: a read that needs input, has failed or been refused, or is done.
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
| Walk (Steps Identity s) Source # | |||||
Defined in Ecluse.Core.Registry.Json.Walk Associated Types
| |||||
| Walk (ST st (Steps (ST st) s)) Source # | |||||
Defined in Ecluse.Core.Registry.Json.Walk Associated Types
| |||||
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.
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.
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.