atproto_sdl/parser/cursor
Token-stream primitives shared by the rest of parser/*: peeking,
advancing, expectation with spanned errors, name/keyword handling,
and doc-comment collection. Every parser helper threads the Tokens
list explicitly; these are the only functions that touch it raw.
Types
pub type Tokens =
List(#(token.Token, token.Span))
Values
pub fn advance(
tokens: List(#(token.Token, token.Span)),
) -> List(#(token.Token, token.Span))
pub fn bang(
tokens: List(#(token.Token, token.Span)),
) -> #(Bool, List(#(token.Token, token.Span)))
pub fn expect(
tokens: List(#(token.Token, token.Span)),
want: token.Token,
label: String,
) -> Result(
#(token.Span, List(#(token.Token, token.Span))),
error.ParseError,
)
pub fn name_token(
tokens: List(#(token.Token, token.Span)),
) -> Result(
#(String, List(#(token.Token, token.Span))),
error.ParseError,
)
A def/field/param name, or a ref-path segment: accepts a plain
identifier or any keyword spelled back out, since real lexicon
property names collide with our small keyword set in practice (e.g.
defs.json’s source.record and release.json’s identifier.type).
pub fn optional_comma(
tokens: List(#(token.Token, token.Span)),
) -> List(#(token.Token, token.Span))
pub fn peek(
tokens: List(#(token.Token, token.Span)),
) -> #(token.Token, token.Span)
pub fn plain_ident(
tokens: List(#(token.Token, token.Span)),
) -> Result(
#(String, List(#(token.Token, token.Span))),
error.ParseError,
)
pub fn take_docs(
tokens: List(#(token.Token, token.Span)),
acc: List(String),
) -> #(option.Option(String), List(#(token.Token, token.Span)))