///|
pub(all) enum SpanKind {
  Internal // 1 in OTLP
  Server // 2
  Client // 3
  Producer // 4
  Consumer // 5
} derive(Eq, Compare)

///|
pub impl Show for SpanKind with output(self, logger) {
  logger.write_string(self.to_string())
}

///|
pub fn SpanKind::to_string(self : SpanKind) -> String {
  match self {
    Internal => "INTERNAL"
    Server => "SERVER"
    Client => "CLIENT"
    Producer => "PRODUCER"
    Consumer => "CONSUMER"
  }
}

///|
pub fn SpanKind::to_int(self : SpanKind) -> Int {
  match self {
    Internal => 1
    Server => 2
    Client => 3
    Producer => 4
    Consumer => 5
  }
}

///|
pub(all) enum SpanStatus {
  Unset // 0 in OTLP
  Ok // 1
  SpanError // 2 — can't use Error (keyword-adjacent)
} derive(Eq, Compare)

///|
pub impl Show for SpanStatus with output(self, logger) {
  logger.write_string(self.to_string())
}

///|
pub fn SpanStatus::to_string(self : SpanStatus) -> String {
  match self {
    Unset => "UNSET"
    Ok => "OK"
    SpanError => "ERROR"
  }
}

///|
pub fn SpanStatus::to_int(self : SpanStatus) -> Int {
  match self {
    Unset => 0
    Ok => 1
    SpanError => 2
  }
}

///|
pub fn SpanStatus::to_json(self : SpanStatus) -> Json {
  self.to_string().to_json()
}

///|
pub fn SpanKind::to_json(self : SpanKind) -> Json {
  self.to_string().to_json()
}