#[derive(Debug, Deserialize)]
#[serde(untagged)]
pub enum ClientMessage {
    REQ(String, String, Vec<Filter>), //["REQ", <sub_id>, <Fittet>]
    Event(String, NostrEvent),   //["EVENT", event]
    CLOSE(String, String),       //["CLSOE", "<sub_id>"]
}

#[derive(Debug, Serialize, Deserialize)]
pub struct Filter {
    pub ids: Option<Vec<String>>,     // event ids 列表
    pub authors: Option<Vec<String>>, // pubkeys 列表，小写字符串
    pub kinds: Option<Vec<u32>>,      // kind 类型列表，数字
    #[serde(flatten)]
    pub tag_filters: HashMap<String, Vec<String>>,
    // 用 HashMap 表示 #<letter> 标签过滤器，例如 #e, #p 等，key 是字符串包含#，value 是对应列表
    pub since: Option<u64>, // Unix 时间戳，秒
    pub until: Option<u64>, // Unix 时间戳，秒
    pub limit: Option<u64>, // 最大返回数
}