Add get and get_mut methods to SignatureMap.

This commit is contained in:
Jimmy Cuadra 2019-07-09 01:52:10 -07:00
parent d7d098ba35
commit 49f3208e7f

View File

@ -131,18 +131,41 @@ impl SignatureMap {
server_name: &str,
signature_set: SignatureSet,
) -> Result<Option<SignatureSet>, Error> {
let url_string = format!("https://{}", server_name);
let url = Url::parse(&url_string)
.map_err(|_| Error::new(format!("invalid server name: {}", server_name)))?;
let host = match url.host() {
Some(host) => host.to_owned(),
None => return Err(Error::new(format!("invalid server name: {}", server_name))),
};
let host = server_name_to_host(server_name)?;
Ok(self.map.insert(host, signature_set))
}
/// Gets a reference to the signature set for the given server, if any.
///
/// # Parameters
///
/// * server_name: The hostname or IP of the homeserver, e.g. `example.com`.
///
/// # Errors
///
/// Returns an error if the given server name cannot be parsed as a valid host.
pub fn get(&self, server_name: &str) -> Result<Option<&SignatureSet>, Error> {
let host = server_name_to_host(server_name)?;
Ok(self.map.get(&host))
}
/// Gets a mutable reference to the signature set for the given server, if any.
///
/// # Parameters
///
/// * server_name: The hostname or IP of the homeserver, e.g. `example.com`.
///
/// # Errors
///
/// Returns an error if the given server name cannot be parsed as a valid host.
pub fn get_mut(&mut self, server_name: &str) -> Result<Option<&mut SignatureSet>, Error> {
let host = server_name_to_host(server_name)?;
Ok(self.map.get_mut(&host))
}
/// The number of servers in the collection.
pub fn len(&self) -> usize {
self.map.len()
@ -363,3 +386,15 @@ fn split_id(id: &str) -> Result<(Algorithm, String), SplitError<'_>> {
Ok((algorithm, signature_id[1].to_string()))
}
/// Attempts to convert a server name as a string into a `url::Host`.
fn server_name_to_host(server_name: &str) -> Result<Host, Error> {
let url_string = format!("https://{}", server_name);
let url = Url::parse(&url_string)
.map_err(|_| Error::new(format!("invalid server name: {}", server_name)))?;
match url.host() {
Some(host) => Ok(host.to_owned()),
None => Err(Error::new(format!("invalid server name: {}", server_name))),
}
}