// The messages of etcd's KV, lease, watch and mvcc services, as the HTTP/JSON
// gateway names their fields. One entry per message; `gateway_json.mbt` reads it in
// both directions, and `scripts/check_field_numbers.py` checks it against etcd's
// .proto files.

///|
fn kv_message_fields(name : String) -> Array[JsonField]? {
  match name {
    "ResponseHeader" =>
      Some([
        { number: 1, name: "cluster_id", kind: UInt64, presence: false, },
        { number: 2, name: "member_id", kind: UInt64, presence: false, },
        { number: 3, name: "revision", kind: Int64, presence: false, },
        { number: 4, name: "raft_term", kind: UInt64, presence: false, },
      ])
    "KeyValue" =>
      Some([
        { number: 1, name: "key", kind: Bytes, presence: false, },
        { number: 2, name: "create_revision", kind: Int64, presence: false, },
        { number: 3, name: "mod_revision", kind: Int64, presence: false, },
        { number: 4, name: "version", kind: Int64, presence: false, },
        { number: 5, name: "value", kind: Bytes, presence: false, },
        { number: 6, name: "lease", kind: Int64, presence: false, },
      ])
    "Event" =>
      Some([
        {
          number: 1,
          name: "type",
          kind: Enum(["PUT", "DELETE"]),
          presence: false,
        },
        { number: 2, name: "kv", kind: Message("KeyValue"), presence: false, },
        {
          number: 3,
          name: "prev_kv",
          kind: Message("KeyValue"),
          presence: false,
        },
      ])
    "RangeRequest" =>
      Some([
        { number: 1, name: "key", kind: Bytes, presence: false, },
        { number: 2, name: "range_end", kind: Bytes, presence: false, },
        { number: 3, name: "limit", kind: Int64, presence: false, },
        { number: 4, name: "revision", kind: Int64, presence: false, },
        {
          number: 5,
          name: "sort_order",
          kind: Enum(["NONE", "ASCEND", "DESCEND"]),
          presence: false,
        },
        {
          number: 6,
          name: "sort_target",
          kind: Enum(["KEY", "VERSION", "CREATE", "MOD", "VALUE"]),
          presence: false,
        },
        { number: 7, name: "serializable", kind: Bool, presence: false, },
        { number: 8, name: "keys_only", kind: Bool, presence: false, },
        { number: 9, name: "count_only", kind: Bool, presence: false, },
        { number: 10, name: "min_mod_revision", kind: Int64, presence: false, },
        { number: 11, name: "max_mod_revision", kind: Int64, presence: false, },
        {
          number: 12,
          name: "min_create_revision",
          kind: Int64,
          presence: false,
        },
        {
          number: 13,
          name: "max_create_revision",
          kind: Int64,
          presence: false,
        },
      ])
    "RangeResponse" =>
      Some([
        {
          number: 1,
          name: "header",
          kind: Message("ResponseHeader"),
          presence: false,
        },
        {
          number: 2,
          name: "kvs",
          kind: Rep(Message("KeyValue")),
          presence: false,
        },
        { number: 3, name: "more", kind: Bool, presence: false, },
        { number: 4, name: "count", kind: Int64, presence: false, },
      ])
    "PutRequest" =>
      Some([
        { number: 1, name: "key", kind: Bytes, presence: false, },
        { number: 2, name: "value", kind: Bytes, presence: false, },
        { number: 3, name: "lease", kind: Int64, presence: false, },
        { number: 4, name: "prev_kv", kind: Bool, presence: false, },
        { number: 5, name: "ignore_value", kind: Bool, presence: false, },
        { number: 6, name: "ignore_lease", kind: Bool, presence: false, },
      ])
    "PutResponse" =>
      Some([
        {
          number: 1,
          name: "header",
          kind: Message("ResponseHeader"),
          presence: false,
        },
        {
          number: 2,
          name: "prev_kv",
          kind: Message("KeyValue"),
          presence: false,
        },
      ])
    "DeleteRangeRequest" =>
      Some([
        { number: 1, name: "key", kind: Bytes, presence: false, },
        { number: 2, name: "range_end", kind: Bytes, presence: false, },
        { number: 3, name: "prev_kv", kind: Bool, presence: false, },
      ])
    "DeleteRangeResponse" =>
      Some([
        {
          number: 1,
          name: "header",
          kind: Message("ResponseHeader"),
          presence: false,
        },
        { number: 2, name: "deleted", kind: Int64, presence: false, },
        {
          number: 3,
          name: "prev_kvs",
          kind: Rep(Message("KeyValue")),
          presence: false,
        },
      ])
    "TxnRequest" =>
      Some([
        {
          number: 1,
          name: "compare",
          kind: Rep(Message("Compare")),
          presence: false,
        },
        {
          number: 2,
          name: "success",
          kind: Rep(Message("RequestOp")),
          presence: false,
        },
        {
          number: 3,
          name: "failure",
          kind: Rep(Message("RequestOp")),
          presence: false,
        },
      ])
    "TxnResponse" =>
      Some([
        {
          number: 1,
          name: "header",
          kind: Message("ResponseHeader"),
          presence: false,
        },
        { number: 2, name: "succeeded", kind: Bool, presence: false, },
        {
          number: 3,
          name: "responses",
          kind: Rep(Message("ResponseOp")),
          presence: false,
        },
      ])
    "Compare" =>
      Some([
        {
          number: 1,
          name: "result",
          kind: Enum(["EQUAL", "GREATER", "LESS", "NOT_EQUAL"]),
          presence: false,
        },
        {
          number: 2,
          name: "target",
          kind: Enum(["VERSION", "CREATE", "MOD", "VALUE", "LEASE"]),
          presence: false,
        },
        { number: 3, name: "key", kind: Bytes, presence: false, },
        { number: 4, name: "version", kind: Int64, presence: true, },
        { number: 5, name: "create_revision", kind: Int64, presence: true, },
        { number: 6, name: "mod_revision", kind: Int64, presence: true, },
        { number: 7, name: "value", kind: Bytes, presence: true, },
        { number: 8, name: "lease", kind: Int64, presence: true, },
        { number: 64, name: "range_end", kind: Bytes, presence: false, },
      ])
    "RequestOp" =>
      Some([
        {
          number: 1,
          name: "request_range",
          kind: Message("RangeRequest"),
          presence: true,
        },
        {
          number: 2,
          name: "request_put",
          kind: Message("PutRequest"),
          presence: true,
        },
        {
          number: 3,
          name: "request_delete_range",
          kind: Message("DeleteRangeRequest"),
          presence: true,
        },
        {
          number: 4,
          name: "request_txn",
          kind: Message("TxnRequest"),
          presence: true,
        },
      ])
    "ResponseOp" =>
      Some([
        {
          number: 1,
          name: "response_range",
          kind: Message("RangeResponse"),
          presence: true,
        },
        {
          number: 2,
          name: "response_put",
          kind: Message("PutResponse"),
          presence: true,
        },
        {
          number: 3,
          name: "response_delete_range",
          kind: Message("DeleteRangeResponse"),
          presence: true,
        },
        {
          number: 4,
          name: "response_txn",
          kind: Message("TxnResponse"),
          presence: true,
        },
      ])
    "CompactionRequest" =>
      Some([
        { number: 1, name: "revision", kind: Int64, presence: false, },
        { number: 2, name: "physical", kind: Bool, presence: false, },
      ])
    "CompactionResponse" =>
      Some([
        {
          number: 1,
          name: "header",
          kind: Message("ResponseHeader"),
          presence: false,
        },
      ])
    "LeaseGrantRequest" =>
      Some([
        { number: 1, name: "TTL", kind: Int64, presence: false, },
        { number: 2, name: "ID", kind: Int64, presence: false, },
      ])
    "LeaseGrantResponse" =>
      Some([
        {
          number: 1,
          name: "header",
          kind: Message("ResponseHeader"),
          presence: false,
        },
        { number: 2, name: "ID", kind: Int64, presence: false, },
        { number: 3, name: "TTL", kind: Int64, presence: false, },
        { number: 4, name: "error", kind: Str, presence: false, },
      ])
    "LeaseRevokeRequest" =>
      Some([{ number: 1, name: "ID", kind: Int64, presence: false, }])
    "LeaseRevokeResponse" =>
      Some([
        {
          number: 1,
          name: "header",
          kind: Message("ResponseHeader"),
          presence: false,
        },
      ])
    "LeaseTimeToLiveRequest" =>
      Some([
        { number: 1, name: "ID", kind: Int64, presence: false, },
        { number: 2, name: "keys", kind: Bool, presence: false, },
      ])
    "LeaseTimeToLiveResponse" =>
      Some([
        {
          number: 1,
          name: "header",
          kind: Message("ResponseHeader"),
          presence: false,
        },
        { number: 2, name: "ID", kind: Int64, presence: false, },
        { number: 3, name: "TTL", kind: Int64, presence: false, },
        { number: 4, name: "grantedTTL", kind: Int64, presence: false, },
        { number: 5, name: "keys", kind: Rep(Bytes), presence: false, },
      ])
    "LeaseLeasesRequest" => Some([])
    "LeaseLeasesResponse" =>
      Some([
        {
          number: 1,
          name: "header",
          kind: Message("ResponseHeader"),
          presence: false,
        },
        {
          number: 2,
          name: "leases",
          kind: Rep(Message("LeaseStatus")),
          presence: false,
        },
      ])
    "LeaseStatus" =>
      Some([{ number: 1, name: "ID", kind: Int64, presence: false, }])
    "LeaseKeepAliveRequest" =>
      Some([{ number: 1, name: "ID", kind: Int64, presence: false, }])
    "LeaseKeepAliveResponse" =>
      Some([
        {
          number: 1,
          name: "header",
          kind: Message("ResponseHeader"),
          presence: false,
        },
        { number: 2, name: "ID", kind: Int64, presence: false, },
        { number: 3, name: "TTL", kind: Int64, presence: false, },
      ])
    "WatchRequest" =>
      Some([
        {
          number: 1,
          name: "create_request",
          kind: Message("WatchCreateRequest"),
          presence: true,
        },
        {
          number: 2,
          name: "cancel_request",
          kind: Message("WatchCancelRequest"),
          presence: true,
        },
        {
          number: 3,
          name: "progress_request",
          kind: Message("WatchProgressRequest"),
          presence: true,
        },
      ])
    "WatchCreateRequest" =>
      Some([
        { number: 1, name: "key", kind: Bytes, presence: false, },
        { number: 2, name: "range_end", kind: Bytes, presence: false, },
        { number: 3, name: "start_revision", kind: Int64, presence: false, },
        { number: 4, name: "progress_notify", kind: Bool, presence: false, },
        {
          number: 5,
          name: "filters",
          kind: Rep(Enum(["NOPUT", "NODELETE"])),
          presence: false,
        },
        { number: 6, name: "prev_kv", kind: Bool, presence: false, },
        { number: 7, name: "watch_id", kind: Int64, presence: false, },
        { number: 8, name: "fragment", kind: Bool, presence: false, },
      ])
    "WatchCancelRequest" =>
      Some([{ number: 1, name: "watch_id", kind: Int64, presence: false, }])
    "WatchProgressRequest" => Some([])
    "WatchResponse" =>
      Some([
        {
          number: 1,
          name: "header",
          kind: Message("ResponseHeader"),
          presence: false,
        },
        { number: 2, name: "watch_id", kind: Int64, presence: false, },
        { number: 3, name: "created", kind: Bool, presence: false, },
        { number: 4, name: "canceled", kind: Bool, presence: false, },
        { number: 5, name: "compact_revision", kind: Int64, presence: false, },
        { number: 6, name: "cancel_reason", kind: Str, presence: false, },
        { number: 7, name: "fragment", kind: Bool, presence: false, },
        {
          number: 11,
          name: "events",
          kind: Rep(Message("Event")),
          presence: false,
        },
      ])
    _ => None
  }
}