diff --git a/src/api/about.rs b/src/api/about.rs index 4675844..5b28e42 100644 --- a/src/api/about.rs +++ b/src/api/about.rs @@ -5,6 +5,7 @@ //! - [`Sbot::get_about_info`] //! - [`Sbot::get_about_message_stream`] //! - [`Sbot::get_description`] +//! - [`Sbot::get_image`] //! - [`Sbot::get_latest_about_message`] //! - [`Sbot::get_name`] //! - [`Sbot::get_name_and_image`] @@ -84,6 +85,40 @@ impl Sbot { Ok(about_message_stream) } + /// Get the latest `image` value for a peer. The value is a blob reference. + /// + /// # Example + /// + /// ```rust + /// use golgi::{Sbot, GolgiError, sbot::Keystore}; + /// + /// async fn image_info() -> Result<(), GolgiError> { + /// let mut sbot_client = Sbot::init(Keystore::Patchwork, None, None).await?; + /// + /// let ssb_id = "@zqshk7o2Rpd/OaZ/MxH6xXONgonP1jH+edK9+GZb/NY=.ed25519"; + /// + /// let image = sbot_client.get_image(ssb_id).await?; + /// + /// println!("peer {} is identified by {}", ssb_id, image); + /// + /// Ok(()) + /// } + /// ``` + pub async fn get_image(&mut self, ssb_id: &str) -> Result { + let mut sbot_connection = self.get_sbot_connection().await?; + let req_id = sbot_connection + .client + .names_get_image_for_req_send(ssb_id) + .await?; + + utils::get_async( + &mut sbot_connection.rpc_reader, + req_id, + utils::string_res_parse, + ) + .await + } + /// Get the value of the latest `about` type message, containing the given /// `key`, for a peer. /// @@ -188,8 +223,16 @@ impl Sbot { &mut self, ssb_id: &str, ) -> Result, GolgiError> { - let keys_to_search_for = vec!["name", "description", "image"]; - self.get_about_info(ssb_id, keys_to_search_for).await + let key_to_search_for = vec!["description"]; + let description = self.get_about_info(ssb_id, key_to_search_for).await?; + + let mut profile_info = self.get_name_and_image(ssb_id).await?; + // extend the `profile_info` HashMap by adding the key-value from the + // `description` HashMap; `profile_info` now contains all three + // key-value pairs + profile_info.extend(description.into_iter()); + + Ok(profile_info) } /// Get the latest `name` and `image` values for a peer. This method can @@ -234,8 +277,15 @@ impl Sbot { &mut self, ssb_id: &str, ) -> Result, GolgiError> { - let keys_to_search_for = vec!["name", "image"]; - self.get_about_info(ssb_id, keys_to_search_for).await + let mut name_and_image: HashMap = HashMap::new(); + + let name = self.get_name(ssb_id).await?; + let image = self.get_image(ssb_id).await?; + + name_and_image.insert("name".to_string(), name); + name_and_image.insert("image".to_string(), image); + + Ok(name_and_image) } /// Get the latest values for the provided keys from the `about` type @@ -337,8 +387,8 @@ impl Sbot { Ok(profile_info) } - /* - /// Get the latest `name` value for a peer. + /// Get the latest `name` value for a peer. The public key of the peer + /// will be returned if no `name` value is found. /// /// # Example /// @@ -350,35 +400,24 @@ impl Sbot { /// /// let ssb_id = "@zqshk7o2Rpd/OaZ/MxH6xXONgonP1jH+edK9+GZb/NY=.ed25519"; /// - /// if let Some(name) = sbot_client.get_name(ssb_id).await? { - /// println!("peer {} is named {}", ssb_id, name) - /// } else { - /// eprintln!("no name found for peer {}", ssb_id) - /// } + /// let name = sbot_client.get_name(ssb_id).await?; + /// + /// println!("peer {} is named {}", ssb_id, name); /// /// Ok(()) /// } /// ``` - pub async fn get_name(&mut self, ssb_id: &str) -> Result, GolgiError> { - self.get_latest_about_message(ssb_id, "name").await - } - */ - - //pub async fn get_name(&mut self, ssb_id: &str) -> Result { pub async fn get_name(&mut self, ssb_id: &str) -> Result { let mut sbot_connection = self.get_sbot_connection().await?; let req_id = sbot_connection .client .names_get_signifier_req_send(ssb_id) - //.names_get_image_for_req_send(ssb_id) - //.names_get_req_send() .await?; utils::get_async( &mut sbot_connection.rpc_reader, req_id, utils::string_res_parse, - //utils::json_res_parse, ) .await }