///|
fn validate_error(value : Value) -> Unit raise AmqpError {
  if value is Null {
    return
  }
  let fields = described_list(value, 0x1dUL, "amqp:error:list")
  if fields.length() < 1 || fields.length() > 3 || !(fields[0] is Symbol(_)) {
    raise Invalid("error requires symbolic condition", 0)
  }
  if !wire_kind(field_at(fields, 1), 1) || !wire_kind(field_at(fields, 2), 10) {
    raise Invalid("error description or info fields", 0)
  }
}

///|
test "error composites reject unrelated descriptors and preserve absent rejection error" {
  assert_true(
    try {
      ignore(Performative::new(0x18, [Described(ULong(0x24UL), List([]))]))
      false
    } catch {
      _ => true
    },
  )
  let value = Described(ULong(0x25UL), List([]))
  assert_eq(Outcome::from_value(value), RejectedWithoutError)
  assert_eq(
    encode_value(Outcome::from_value(value).value()),
    encode_value(value),
  )
  assert_true(
    try {
      ignore(
        Outcome::from_value(
          Described(ULong(0x27UL), List([Null, Null, MapValue([])])),
        ),
      )
      false
    } catch {
      _ => true
    },
  )
}