///|
/// 已经过完整合法性检查的 JSON 文档。
///
/// 本类型没有公开构造器,构造权属于解析器。它只代表“该文档在 MoonStream
/// 的严格语法策略下完整且合法”,**不**代表模型意图正确、符合业务 Schema、
/// 获得执行授权,或可以安全地产生副作用。
pub struct CompletedDocument {
  text : String
  /// 文档的原始字节数(不是 UTF-16 码元数)。
  byte_length : Int
} derive(Eq, ToJson, Debug)

///|
/// 私有构造器:只有同包的解析器可以创建。
fn CompletedDocument::new(
  text : String,
  byte_length : Int,
) -> CompletedDocument {
  { text, byte_length }
}

///|
/// 原始完整文本。
pub fn CompletedDocument::to_string(self : CompletedDocument) -> String {
  self.text
}

///|
/// 文档的原始字节数。
///
/// 这是解析器实际消费的字节数,对非 ASCII 文档与 `to_string().length()`
/// (UTF-16 码元数)不同。
pub fn CompletedDocument::byte_length(self : CompletedDocument) -> Int {
  self.byte_length
}

///|
/// 转换为 `Json`。
///
/// 这是显式操作:`Json` 的数值语义会做双精度转换,需要无损数字时请使用
/// 事件流里的 `NumberLiteral`。转换失败时抛出 JSON 解析错误。
pub fn CompletedDocument::to_json(
  self : CompletedDocument,
) -> Json raise @json.ParseError {
  @json.parse(self.text)
}

///|
/// `finish` 的结束原因。
///
/// 只有 `EndOfStream` 可能产生 `CompletedDocument`:取消或截断都不代表
/// 模型已经说完,即使此刻文本看起来恰好完整。
pub(all) enum EndReason {
  EndOfStream
  Cancelled
  Truncated
} derive(Eq, Debug, ToJson)

///|
/// `finish` 的结果。
pub(all) enum FinishResult {
  /// 文档完整且合法。
  Completed(CompletedDocument)
  /// 输入合法但尚未结束;`pos` 是缺失内容的位置,`expected` 是期待的内容。
  Incomplete(pos~ : Int, expected~ : String)
  /// 结束原因不是正常结束,不产生结果对象。
  Aborted(reason~ : EndReason)
} derive(Eq, ToJson, Debug)