///|
/// 底座错误 → moonxml 错误面:kind 与 span 逐字段翻译(契约三:位置透传)。
fn translate_error(base_error : @xml.XmlError) -> XmlError {
  match base_error {
    @xml.At(error~, span~) =>
      XmlError::At(error=kind_of(error), span=translate_span(span))
  }
}

///|
/// 底座错误词表 → 本包词表(变体名对位,规范拼写保留)。
fn kind_of(base_kind : @xml.XmlErrorKind) -> XmlErrorKind {
  match base_kind {
    @xml.UnexpectedEof => XmlErrorKind::UnexpectedEof
    @xml.InvalidSyntax(message) => XmlErrorKind::InvalidSyntax(message)
    @xml.UnmatchedTag(expected~, found~) =>
      XmlErrorKind::UnmatchedTag(expected~, found~)
    @xml.InvalidAttribute(message) => XmlErrorKind::InvalidAttribute(message)
    @xml.InvalidEntity(message) => XmlErrorKind::InvalidEntity(message)
  }
}

///|
fn translate_span(base_span : @xml.SourceSpan) -> SourceSpan {
  {
    start: translate_position(base_span.start),
    end: translate_position(base_span.end),
  }
}

///|
fn translate_position(base_position : @xml.SourcePosition) -> SourcePosition {
  {
    offset: base_position.offset,
    line: base_position.line,
    column: base_position.column,
  }
}