///|
/// The LDAPMessage envelope (RFC 4511 4.1.1).
pub struct LdapMessage {
  message_id : Int
  op : ProtocolOp
  controls : Array[Control]?
} derive(Eq, @debug.Debug)

///|
pub fn LdapMessage::new(message_id : Int, op : ProtocolOp) -> LdapMessage {
  { message_id, op, controls: None }
}

///|
pub fn LdapMessage::with_controls(
  message_id : Int,
  op : ProtocolOp,
  controls : Array[Control],
) -> LdapMessage {
  { message_id, op, controls: Some(controls) }
}

///|
/// Application tag numbers for each protocol op (RFC 4511 4.1.1.2).
pub fn protocol_op_tag(op : ProtocolOp) -> Int {
  match op {
    BindRequest(_) => 0
    BindResponse(_) => 1
    UnbindRequest => 2
    SearchRequest(_) => 3
    SearchResultEntry(_) => 4
    SearchResultDone(_) => 5
    SearchResultReference(_) => 19
    ModifyRequest(_) => 6
    ModifyResponse(_) => 7
    AddRequest(_) => 8
    AddResponse(_) => 9
    DelRequest(_) => 10
    DelResponse(_) => 11
    ModifyDnRequest(_) => 12
    ModifyDnResponse(_) => 13
    CompareRequest(_) => 14
    CompareResponse(_) => 15
    ExtendedRequest(_) => 23
    ExtendedResponse(_) => 24
    AbandonRequest(_) => 16
  }
}

///|
pub fn protocol_op_name(op : ProtocolOp) -> String {
  match op {
    BindRequest(_) => "bindRequest"
    BindResponse(_) => "bindResponse"
    UnbindRequest => "unbindRequest"
    SearchRequest(_) => "searchRequest"
    SearchResultEntry(_) => "searchResultEntry"
    SearchResultDone(_) => "searchResultDone"
    SearchResultReference(_) => "searchResultReference"
    ModifyRequest(_) => "modifyRequest"
    ModifyResponse(_) => "modifyResponse"
    AddRequest(_) => "addRequest"
    AddResponse(_) => "addResponse"
    DelRequest(_) => "delRequest"
    DelResponse(_) => "delResponse"
    ModifyDnRequest(_) => "modifyDNRequest"
    ModifyDnResponse(_) => "modifyDNResponse"
    CompareRequest(_) => "compareRequest"
    CompareResponse(_) => "compareResponse"
    ExtendedRequest(_) => "extendedReq"
    ExtendedResponse(_) => "extendedResp"
    AbandonRequest(_) => "abandonRequest"
  }
}