diff options
Diffstat (limited to 'src/abook.rs')
-rw-r--r-- | src/abook.rs | 107 |
1 files changed, 102 insertions, 5 deletions
diff --git a/src/abook.rs b/src/abook.rs index 8423872..59981ba 100644 --- a/src/abook.rs +++ b/src/abook.rs @@ -15,15 +15,112 @@ // along with this program. If not, see <https://www.gnu.org/licenses/>. use crate::{client::Client, error::Error}; +use serde::Deserialize; -pub struct Abook; +#[derive(Debug, Default, Deserialize)] +pub struct Abook { + #[serde(rename = "abook_id")] + id: u32, -pub fn abook() -> Abook { - Abook {} + #[serde(rename = "abook_account")] + account: u32, + + #[serde(rename = "abook_channel")] + channel: u32, + + #[serde(rename = "abook_xchan")] + xchan: String, + + #[serde(rename = "abook_my_perms")] + my_perms: u16, + + #[serde(rename = "abook_their_perms")] + their_perms: u16, + + // Closeness is a number between 0 and 99, but is somehow + // returned as a string. + #[serde(rename = "abook_closeness")] + closeness: String, + + #[serde(rename = "abook_created")] + created: String, + + #[serde(rename = "abook_updated")] + updated: String, + + #[serde(rename = "abook_connected")] + connected: String, + + #[serde(rename = "abook_dob")] + dob: String, + + #[serde(rename = "abook_flags")] + flags: u16, // No longer used + + #[serde(rename = "abook_profile")] + profile: String, + + #[serde(rename = "abook_blocked")] + blocked: u8, + + #[serde(rename = "abook_ignored")] + ignored: u8, + + #[serde(rename = "abook_hidden")] + hidden: u8, + + #[serde(rename = "abook_archived")] + archived: u8, + + #[serde(rename = "abook_pending")] + pending: u8, + + #[serde(rename = "abook_unconnected")] + unconnected: u8, // Currently unused + + #[serde(rename = "abook_self")] + myself: u8, // original name `self` + + #[serde(rename = "abook_feed")] + feed: u8, + + #[serde(rename = "abook_incl")] + incl: String, + + #[serde(rename = "abook_excl")] + excl: String, + + #[serde(rename = "abook_instance")] + instance: String, } impl Abook { - pub fn fetch(&self, client: &Client) -> Result<String, Error> { - client.fetch_stream("abook", &()) + pub fn z() -> AbookRequest { + AbookRequest::default() + } +} + +#[derive(Debug, Default)] +pub struct AbookRequest { + abook_id: Option<u32>, +} + +impl AbookRequest { + /// Limit to ABConfigs for a given contact + /// + /// `abook` is the abook id of the given contact + pub fn with_abook_id(mut self, abook: u32) -> AbookRequest { + self.abook_id = Some(abook); + self + } + + pub fn fetch(&self, client: &Client) -> Result<Vec<Abook>, Error> { + let mut req = client.get("abook"); + + if let Some(id) = self.abook_id { + req = req.query(&[("abook_id", id.to_string())]); + } + + Ok(serde_json::from_str(&req.send()?.text()?)?) } } |