aboutsummaryrefslogtreecommitdiffstats
path: root/mumd/src/state
diff options
context:
space:
mode:
authorKapten Z∅∅m <55669224+default-username-852@users.noreply.github.com>2021-06-06 23:19:05 +0200
committerGitHub <noreply@github.com>2021-06-06 23:19:05 +0200
commit360b232de29f0104a8beb0c57e8defd9e54c9e6c (patch)
tree3595d6ae9dbe293ef0403ce581edd4742569147c /mumd/src/state
parentea8b1906e14c3b319d3ad184b6d7cfc507c23b4f (diff)
parent55a12fbdfb435886b2f211fe1fb00daafb32b6a7 (diff)
downloadmum-360b232de29f0104a8beb0c57e8defd9e54c9e6c.tar.gz
Merge pull request #92 from mum-rs/text-message
Text message
Diffstat (limited to 'mumd/src/state')
-rw-r--r--mumd/src/state/channel.rs2
-rw-r--r--mumd/src/state/server.rs39
2 files changed, 40 insertions, 1 deletions
diff --git a/mumd/src/state/channel.rs b/mumd/src/state/channel.rs
index 5b6d669..f58ed15 100644
--- a/mumd/src/state/channel.rs
+++ b/mumd/src/state/channel.rs
@@ -4,7 +4,7 @@ use mumble_protocol::control::msgs;
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
-#[derive(Clone, Debug, Deserialize, Serialize)]
+#[derive(Clone, Debug, Default, Deserialize, Serialize)]
pub struct Channel {
description: Option<String>,
links: Vec<u32>,
diff --git a/mumd/src/state/server.rs b/mumd/src/state/server.rs
index c9f8a69..78a10b9 100644
--- a/mumd/src/state/server.rs
+++ b/mumd/src/state/server.rs
@@ -3,6 +3,7 @@ use crate::state::user::User;
use log::*;
use mumble_protocol::control::msgs;
+use mumlib::error::ChannelIdentifierError;
use serde::{Deserialize, Serialize};
use std::collections::hash_map::Entry;
use std::collections::HashMap;
@@ -88,6 +89,44 @@ impl Server {
&self.channels
}
+ /// Takes a channel name and returns either a tuple with the channel id and a reference to the
+ /// channel struct if the channel name unambiguosly refers to a channel, or an error describing
+ /// if the channel identifier was ambigous or invalid.
+ /// note that doctests currently aren't run in binary crates yet (see #50784)
+ /// ```
+ /// use crate::state::channel::Channel;
+ /// let mut server = Server::new();
+ /// let channel = Channel {
+ /// name: "Foobar".to_owned(),
+ /// ..Default::default(),
+ /// };
+ /// server.channels.insert(0, channel.clone);
+ /// assert_eq!(server.channel_name("Foobar"), Ok((0, &channel)));
+ /// ```
+ pub fn channel_name(&self, channel_name: &str) -> Result<(u32, &Channel), ChannelIdentifierError> {
+ let matches = self.channels
+ .iter()
+ .map(|e| ((*e.0, e.1), e.1.path(&self.channels)))
+ .filter(|e| e.1.ends_with(channel_name))
+ .collect::<Vec<_>>();
+ Ok(match matches.len() {
+ 0 => {
+ let soft_matches = self.channels
+ .iter()
+ .map(|e| ((*e.0, e.1), e.1.path(&self.channels).to_lowercase()))
+ .filter(|e| e.1.ends_with(&channel_name.to_lowercase()))
+ .collect::<Vec<_>>();
+ match soft_matches.len() {
+ 0 => return Err(ChannelIdentifierError::Invalid),
+ 1 => soft_matches.get(0).unwrap().0,
+ _ => return Err(ChannelIdentifierError::Ambiguous),
+ }
+ }
+ 1 => matches.get(0).unwrap().0,
+ _ => return Err(ChannelIdentifierError::Ambiguous),
+ })
+ }
+
pub fn host_mut(&mut self) -> &mut Option<String> {
&mut self.host
}