nostr_rust

My fork of nostr_rust
git clone git://jb55.com/nostr_rust
Log | Files | Refs | README

req.rs (3167B)


      1 use crate::utils::random_hash;
      2 use serde::{Deserialize, Serialize};
      3 use serde_json::json;
      4 use std::fmt;
      5 
      6 /// Req struct is used to request events and subscribe to new updates.
      7 #[derive(Debug, Clone, Serialize, Deserialize)]
      8 pub struct Req {
      9     /// `<subscription_id>` is a random string that should be used to represent a subscription.
     10     pub subscription_id: String,
     11     /// `<filters>` is a JSON object that determines what events will be sent in that subscription, it can have the following attributes:
     12     pub filters: Vec<ReqFilter>,
     13 }
     14 
     15 /// ReqFilter is a JSON object that determines what events will be sent in that subscription.
     16 #[derive(Debug, Clone, Serialize, Deserialize)]
     17 pub struct ReqFilter {
     18     /// a list of event ids or prefixes
     19     pub ids: Option<Vec<String>>,
     20     /// a list of pubkeys or prefixes, the pubkey of an event must be one of these
     21     pub authors: Option<Vec<String>>,
     22     /// a list of a kind numbers
     23     pub kinds: Option<Vec<u8>>,
     24     /// a list of event ids that are referenced in an "e" tag
     25     #[serde(rename = "#e")]
     26     pub e: Option<Vec<String>>,
     27     /// a list of pubkeys that are referenced in a "p" tag
     28     #[serde(rename = "#p")]
     29     pub p: Option<Vec<String>>,
     30     /// a timestamp, events must be newer than this to pass
     31     pub since: Option<u64>,
     32     /// a timestamp, events must be older than this to pass
     33     pub until: Option<u64>,
     34     /// maximum number of events to be returned in the initial query
     35     pub limit: Option<u64>,
     36 }
     37 
     38 impl ReqFilter {
     39     /// Return a clean json object (Value)
     40     pub fn to_json(&self) -> serde_json::Value {
     41         let mut json = json!({});
     42 
     43         if let Some(ids) = &self.ids {
     44             json["ids"] = json!(ids);
     45         }
     46 
     47         if let Some(authors) = &self.authors {
     48             json["authors"] = json!(authors);
     49         }
     50 
     51         if let Some(kinds) = &self.kinds {
     52             json["kinds"] = json!(kinds);
     53         }
     54 
     55         if let Some(e) = &self.e {
     56             json["#e"] = json!(e);
     57         }
     58 
     59         if let Some(p) = &self.p {
     60             json["#p"] = json!(p);
     61         }
     62 
     63         if let Some(since) = &self.since {
     64             json["since"] = json!(since);
     65         }
     66 
     67         if let Some(until) = &self.until {
     68             json["until"] = json!(until);
     69         }
     70 
     71         if let Some(limit) = &self.limit {
     72             json["limit"] = json!(limit);
     73         }
     74 
     75         json
     76     }
     77 }
     78 
     79 impl Req {
     80     pub fn new(subscription_id: Option<&str>, filters: Vec<ReqFilter>) -> Self {
     81         Self {
     82             subscription_id: subscription_id.unwrap_or(&random_hash()).to_string(),
     83             filters,
     84         }
     85     }
     86 
     87     pub fn get_close_event(&self) -> String {
     88         json!({
     89             "subscription_id": self.subscription_id,
     90             "close": true
     91         })
     92         .to_string()
     93     }
     94 }
     95 
     96 impl fmt::Display for Req {
     97     /// Return the serialized event
     98     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
     99         let mut req = json!(["REQ", self.subscription_id]);
    100         for filter in &self.filters {
    101             req.as_array_mut().unwrap().push(filter.to_json());
    102         }
    103 
    104         write!(f, "{}", serde_json::to_string(&req).unwrap())
    105     }
    106 }