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)))
Search Document