///|
pub suberror ParseError {
  UnexpectedEnd(position~ : SourcePosition)
  UnexpectedCharacter(position~ : SourcePosition, character~ : Char)
  Expected(position~ : SourcePosition, token~ : String)
  InvalidNumber(position~ : SourcePosition, text~ : String)
  InvalidReference(position~ : SourcePosition, text~ : String)
  InvalidEntity(position~ : SourcePosition, text~ : String)
  InvalidHeader(position~ : SourcePosition, text~ : String)
  UnsupportedFile(text~ : String)
} derive(Debug)

///|
fn make_position(offset : Int, line : Int, column : Int) -> SourcePosition {
  SourcePosition::{ offset, line, column }
}

///|
fn unexpected_end(offset : Int, line : Int, column : Int) -> ParseError {
  ParseError::UnexpectedEnd(position=make_position(offset, line, column))
}

///|
fn expected(
  offset : Int,
  line : Int,
  column : Int,
  token : String,
) -> ParseError {
  ParseError::Expected(position=make_position(offset, line, column), token~)
}