1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155
use std::{ borrow::Cow, collections::{HashMap, HashSet}, }; use crate::{CaseSensitivity, CommandBuilder}; /// Configuration for a [`Parser`]. /// /// [`Parser`]: struct.Parser.html #[derive(Clone, Debug, Default)] pub struct CommandParserConfig<'a> { commands: HashSet<CaseSensitivity>, prefixes: HashMap<Cow<'a, str>, Cow<'a, str>>, } impl<'a> CommandParserConfig<'a> { /// Creates a fresh default configuration with no commands or prefixes. pub fn new() -> Self { Self::default() } /// Returns an immutable reference to the commands. pub fn commands(&self) -> &HashSet<CaseSensitivity> { &self.commands } /// Returns a mutable reference to the commands. /// /// Use the [`add_command`] and [`remove_command`] methods for an easier way /// to manage commands. /// /// [`add_command`]: #method.add_command /// [`remove_command`]: #method.remove_command pub fn commands_mut(&mut self) -> &mut HashSet<CaseSensitivity> { &mut self.commands } /// Returns an immutable reference to the prefixes. /// /// Use the [`add_prefix`] and [`remove_prefix`] methods for an easier way /// to manage prefixes. /// /// [`add_prefix`]: #method.add_prefix /// [`remove_prefix`]: #method.remove_prefix pub fn prefixes(&self) -> &HashMap<Cow<'_, str>, Cow<'_, str>> { &self.prefixes } /// Returns a mutable reference to the prefixes. pub fn prefixes_mut(&mut self) -> &mut HashMap<Cow<'a, str>, Cow<'a, str>> { &mut self.prefixes } /// Returns a [`CommandBuilder`] which can be used to add a command to the list of commands. /// /// # Examples /// /// ```rust /// use twilight_command_parser::CommandParserConfig; /// /// let mut config = CommandParserConfig::new(); /// config.command("ping").add(); /// assert_eq!(1, config.commands().len()); /// ``` /// /// [`CommandBuilder`]: struct.CommandBuilder.html pub fn command<'b>(&'b mut self, name: impl Into<String>) -> CommandBuilder<'b, 'a> { CommandBuilder { name: name.into(), case_sensitive: false, config: self, } } pub(crate) fn add_command(&mut self, name: String, case_sensitive: bool) -> bool { let command = if case_sensitive { CaseSensitivity::Sensitive(name) } else { CaseSensitivity::Insensitive(name.into()) }; self.commands.insert(command) } /// Removes a command from the list of commands. /// /// Any commands that would match the command provided are removed. /// /// # Examples /// /// ```rust /// use twilight_command_parser::CommandParserConfig; /// /// let mut config = CommandParserConfig::new(); /// config.command("ping").case_sensitive().add(); /// config.command("PING").add(); /// assert_eq!(2, config.commands().len()); /// /// // Now remove it and verify that there are no commands. /// config.remove_command("ping"); /// assert!(config.commands().is_empty()); /// ``` pub fn remove_command(&mut self, command: impl AsRef<str>) { self.commands.retain(|c| c != command.as_ref()); } /// Adds a prefix to the list of prefixes. /// /// # Examples /// /// ```rust /// use twilight_command_parser::CommandParserConfig; /// /// let mut config = CommandParserConfig::new(); /// config.add_prefix("!"); /// assert_eq!(1, config.prefixes().len()); /// ``` pub fn add_prefix(&mut self, prefix: impl Into<Cow<'a, str>>) { self.prefixes.insert(prefix.into(), Cow::Borrowed("")); } /// Removes a prefix from the list of prefixes. /// /// # Examples /// /// ```rust /// use twilight_command_parser::CommandParserConfig; /// /// let mut config = CommandParserConfig::new(); /// config.add_prefix("!"); /// config.add_prefix("~"); /// assert_eq!(2, config.prefixes().len()); /// /// // Now remove one and verify that there is only 1 prefix. /// config.remove_prefix("!"); /// assert_eq!(1, config.prefixes().len()); /// ``` pub fn remove_prefix(&mut self, prefix: impl Into<Cow<'a, str>>) -> Option<Cow<'a, str>> { self.prefixes.remove(&prefix.into()) } } #[cfg(test)] mod tests { use super::CommandParserConfig; #[test] fn test_getters() { let mut config = CommandParserConfig::new(); assert!(config.commands().is_empty()); assert!(config.commands_mut().is_empty()); assert!(config.prefixes().is_empty()); assert!(config.prefixes_mut().is_empty()); } }