///|
pub(all) enum IonError {
  UnexpectedEof
  InvalidBinary(String)
  InvalidText(String)
  InvalidUtf8
  InvalidSymbol(String)
  InvalidTimestamp(String)
  InvalidDecimal(String)
  InvalidNumber(String)
  InvalidBlob(String)
  InvalidAnnotation(String)
  InvalidSymbolTable(String)
  Unsupported(String)
  EmptyDocument
} derive(Eq, Debug)

///|
pub fn IonError::code(self : IonError) -> String {
  match self {
    UnexpectedEof => "ION001"
    InvalidBinary(_) => "ION002"
    InvalidText(_) => "ION003"
    InvalidUtf8 => "ION004"
    InvalidSymbol(_) => "ION005"
    InvalidTimestamp(_) => "ION006"
    InvalidDecimal(_) => "ION007"
    InvalidNumber(_) => "ION008"
    InvalidBlob(_) => "ION009"
    InvalidAnnotation(_) => "ION010"
    InvalidSymbolTable(_) => "ION011"
    Unsupported(_) => "ION012"
    EmptyDocument => "ION013"
  }
}

///|
pub fn IonError::message(self : IonError) -> String {
  match self {
    UnexpectedEof => "unexpected end of Ion input"
    InvalidBinary(reason) => "invalid Ion binary: " + reason
    InvalidText(reason) => "invalid Ion text: " + reason
    InvalidUtf8 => "invalid UTF-8 in Ion string or symbol"
    InvalidSymbol(reason) => "invalid Ion symbol: " + reason
    InvalidTimestamp(reason) => "invalid Ion timestamp: " + reason
    InvalidDecimal(reason) => "invalid Ion decimal: " + reason
    InvalidNumber(reason) => "invalid Ion number: " + reason
    InvalidBlob(reason) => "invalid Ion blob/clob: " + reason
    InvalidAnnotation(reason) => "invalid Ion annotation: " + reason
    InvalidSymbolTable(reason) => "invalid Ion symbol table: " + reason
    Unsupported(reason) => "unsupported Ion feature: " + reason
    EmptyDocument => "Ion document contains no values"
  }
}