aboutsummaryrefslogtreecommitdiff
path: root/azalea-brigadier/src/suggestion/mod.rs
diff options
context:
space:
mode:
authormat <git@matdoes.dev>2023-10-12 20:14:29 -0500
committermat <git@matdoes.dev>2023-10-12 20:14:29 -0500
commit38db231ea8fa0fb223e16637db0b6ec65b2b81ef (patch)
treef8f61b04ad0b498b85bffb133c51af1670a33ddf /azalea-brigadier/src/suggestion/mod.rs
parentd5f424b8c2fba9b3283aef36fe9e1e051636614c (diff)
downloadazalea-drasl-38db231ea8fa0fb223e16637db0b6ec65b2b81ef.tar.xz
brigadier usages
Diffstat (limited to 'azalea-brigadier/src/suggestion/mod.rs')
-rwxr-xr-xazalea-brigadier/src/suggestion/mod.rs102
1 files changed, 91 insertions, 11 deletions
diff --git a/azalea-brigadier/src/suggestion/mod.rs b/azalea-brigadier/src/suggestion/mod.rs
index c404adc7..bc0e7608 100755
--- a/azalea-brigadier/src/suggestion/mod.rs
+++ b/azalea-brigadier/src/suggestion/mod.rs
@@ -8,6 +8,10 @@ use azalea_buf::McBufWritable;
use azalea_chat::FormattedText;
#[cfg(feature = "azalea-buf")]
use std::io::Write;
+use std::{
+ fmt::{self, Display},
+ hash::Hash,
+};
pub use suggestions::Suggestions;
pub use suggestions_builder::SuggestionsBuilder;
@@ -16,22 +20,50 @@ pub use suggestions_builder::SuggestionsBuilder;
/// The `M` generic is the type of the tooltip, so for example a `String` or
/// just `()` if you don't care about it.
#[derive(Debug, Clone, Hash, Eq, PartialEq)]
-pub struct Suggestion<M = String> {
- pub text: String,
+pub struct Suggestion<M = ()>
+where
+ M: Clone,
+{
pub range: StringRange,
+ value: SuggestionValue,
pub tooltip: Option<M>,
}
+#[derive(Debug, Clone, Hash, Eq, PartialEq)]
+pub enum SuggestionValue {
+ Integer(i32),
+ Text(String),
+}
+
+impl Suggestion<()> {
+ pub fn new(range: StringRange, text: &str) -> Suggestion<()> {
+ Suggestion {
+ range,
+ value: SuggestionValue::Text(text.to_string()),
+ tooltip: None,
+ }
+ }
+}
+
impl<M: Clone> Suggestion<M> {
+ pub fn new_with_tooltip(range: StringRange, text: &str, tooltip: M) -> Self {
+ Self {
+ range,
+ value: SuggestionValue::Text(text.to_string()),
+ tooltip: Some(tooltip),
+ }
+ }
+
pub fn apply(&self, input: &str) -> String {
+ let text = self.value.to_string();
if self.range.start() == 0 && self.range.end() == input.len() {
- return input.to_string();
+ return text;
}
- let mut result = String::with_capacity(self.text.len());
+ let mut result = String::with_capacity(text.len());
if self.range.start() > 0 {
result.push_str(&input[0..self.range.start()]);
}
- result.push_str(&self.text);
+ result.push_str(&text);
if self.range.end() < input.len() {
result.push_str(&input[self.range.end()..]);
}
@@ -39,30 +71,78 @@ impl<M: Clone> Suggestion<M> {
result
}
- pub fn expand(&self, command: &str, range: &StringRange) -> Suggestion<M> {
- if range == &self.range {
+ pub fn expand(&self, command: &str, range: StringRange) -> Suggestion<M> {
+ if range == self.range {
return self.clone();
}
let mut result = String::new();
if range.start() < self.range.start() {
result.push_str(&command[range.start()..self.range.start()]);
}
- result.push_str(&self.text);
+ result.push_str(&self.value.to_string());
if range.end() > self.range.end() {
result.push_str(&command[self.range.end()..range.end()]);
}
Suggestion {
- range: range.clone(),
- text: result,
+ range,
+ value: SuggestionValue::Text(result),
tooltip: self.tooltip.clone(),
}
}
+
+ pub fn text(&self) -> String {
+ self.value.to_string()
+ }
+}
+
+impl SuggestionValue {
+ pub fn cmp_ignore_case(&self, other: &Self) -> std::cmp::Ordering {
+ match (self, other) {
+ (SuggestionValue::Text(a), SuggestionValue::Text(b)) => {
+ a.to_lowercase().cmp(&b.to_lowercase())
+ }
+ (SuggestionValue::Integer(a), SuggestionValue::Integer(b)) => a.cmp(b),
+ _ => {
+ let a = self.to_string();
+ let b = other.to_string();
+ a.cmp(&b)
+ }
+ }
+ }
+}
+
+impl Display for SuggestionValue {
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+ match self {
+ SuggestionValue::Text(text) => write!(f, "{text}"),
+ SuggestionValue::Integer(value) => write!(f, "{value}"),
+ }
+ }
+}
+
+impl Ord for SuggestionValue {
+ fn cmp(&self, other: &Self) -> std::cmp::Ordering {
+ match (self, other) {
+ (SuggestionValue::Text(a), SuggestionValue::Text(b)) => a.cmp(b),
+ (SuggestionValue::Integer(a), SuggestionValue::Integer(b)) => a.cmp(b),
+ _ => {
+ let a = self.to_string();
+ let b = other.to_string();
+ a.cmp(&b)
+ }
+ }
+ }
+}
+impl PartialOrd for SuggestionValue {
+ fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> {
+ Some(self.cmp(other))
+ }
}
#[cfg(feature = "azalea-buf")]
impl McBufWritable for Suggestion<FormattedText> {
fn write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
- self.text.write_into(buf)?;
+ self.value.to_string().write_into(buf)?;
self.tooltip.write_into(buf)?;
Ok(())
}