// ============ 发布订阅命令 ============

///|
/// 发布消息到指定频道
/// 返回接收到消息的订阅者数量
pub async fn RedisClient::publish(
  self : RedisClient,
  channel : String,
  message : String,
) -> RedisInt {
  self.send(["PUBLISH", channel, message]).to_int()
}

///|
/// 订阅一个或多个频道
/// 返回订阅确认信息数组
pub async fn RedisClient::subscribe(
  self : RedisClient,
  channels : Array[String],
) -> RedisArray {
  let args = ["SUBSCRIBE", ..channels]
  self.send(args).to_array()
}

///|
/// 取消订阅频道
/// 如果不指定频道,则取消所有订阅
pub async fn RedisClient::unsubscribe(
  self : RedisClient,
  channels? : Array[String],
) -> RedisArray {
  let args = match channels {
    Some(chs) => ["UNSUBSCRIBE", ..chs]
    None => ["UNSUBSCRIBE"]
  }
  self.send(args).to_array()
}

///|
/// 订阅一个或多个模式
/// 返回模式订阅确认信息数组
pub async fn RedisClient::psubscribe(
  self : RedisClient,
  patterns : Array[String],
) -> RedisArray {
  let args = ["PSUBSCRIBE", ..patterns]
  self.send(args).to_array()
}

///|
/// 取消订阅模式
/// 如果不指定模式,则取消所有模式订阅
pub async fn RedisClient::punsubscribe(
  self : RedisClient,
  patterns? : Array[String],
) -> RedisArray {
  let args = match patterns {
    Some(pts) => ["PUNSUBSCRIBE", ..pts]
    None => ["PUNSUBSCRIBE"]
  }
  self.send(args).to_array()
}

///|
/// 查看订阅与发布系统状态
/// PUBSUB CHANNELS [pattern] - 列出当前活跃频道
pub async fn RedisClient::pubsub_channels(
  self : RedisClient,
  pattern? : String,
) -> RedisArray {
  let args = match pattern {
    Some(p) => ["PUBSUB", "CHANNELS", p]
    None => ["PUBSUB", "CHANNELS"]
  }
  self.send(args).to_array()
}

///|
/// 查看订阅与发布系统状态
/// PUBSUB NUMSUB [channel [channel ...]] - 返回频道订阅者数量
pub async fn RedisClient::pubsub_numsub(
  self : RedisClient,
  channels? : Array[String],
) -> RedisArray {
  let args = match channels {
    Some(chs) => ["PUBSUB", "NUMSUB", ..chs]
    None => ["PUBSUB", "NUMSUB"]
  }
  self.send(args).to_array()
}

///|
/// 查看订阅与发布系统状态
/// PUBSUB NUMPAT - 返回模式订阅数量
pub async fn RedisClient::pubsub_numpat(self : RedisClient) -> RedisInt {
  self.send(["PUBSUB", "NUMPAT"]).to_int()
}

///|
/// 查看订阅与发布系统状态
/// PUBSUB SHARDCHANNELS [pattern] - 列出分片频道
pub async fn RedisClient::pubsub_shardchannels(
  self : RedisClient,
  pattern? : String,
) -> RedisArray {
  let args = match pattern {
    Some(p) => ["PUBSUB", "SHARDCHANNELS", p]
    None => ["PUBSUB", "SHARDCHANNELS"]
  }
  self.send(args).to_array()
}

///|
/// 查看订阅与发布系统状态
/// PUBSUB SHARDNUMSUB [channel [channel ...]] - 返回分片频道订阅者数量
pub async fn RedisClient::pubsub_shardnumsub(
  self : RedisClient,
  channels? : Array[String],
) -> RedisArray {
  let args = match channels {
    Some(chs) => ["PUBSUB", "SHARDNUMSUB", ..chs]
    None => ["PUBSUB", "SHARDNUMSUB"]
  }
  self.send(args).to_array()
}

///|
/// 发布消息到分片频道
/// 返回接收到消息的订阅者数量
pub async fn RedisClient::spublish(
  self : RedisClient,
  channel : String,
  message : String,
) -> RedisInt {
  self.send(["SPUBLISH", channel, message]).to_int()
}

///|
/// 订阅分片频道
/// 返回订阅确认信息数组
pub async fn RedisClient::ssubscribe(
  self : RedisClient,
  channels : Array[String],
) -> RedisArray {
  let args = ["SSUBSCRIBE", ..channels]
  self.send(args).to_array()
}

///|
/// 取消订阅分片频道
/// 如果不指定频道,则取消所有分片频道订阅
pub async fn RedisClient::sunsubscribe(
  self : RedisClient,
  channels? : Array[String],
) -> RedisArray {
  let args = match channels {
    Some(chs) => ["SUNSUBSCRIBE", ..chs]
    None => ["SUNSUBSCRIBE"]
  }
  self.send(args).to_array()
}