azalea_brigadier/arguments/
bool_argument_type.rs

1use std::{any::Any, sync::Arc};
2
3use super::ArgumentType;
4use crate::{
5    context::CommandContext,
6    exceptions::CommandSyntaxException,
7    string_reader::StringReader,
8    suggestion::{Suggestions, SuggestionsBuilder},
9};
10
11#[derive(Default)]
12struct Boolean;
13
14impl ArgumentType for Boolean {
15    fn parse(&self, reader: &mut StringReader) -> Result<Arc<dyn Any>, CommandSyntaxException> {
16        Ok(Arc::new(reader.read_boolean()?))
17    }
18
19    fn list_suggestions(&self, mut builder: SuggestionsBuilder) -> Suggestions {
20        if "true".starts_with(builder.remaining_lowercase()) {
21            builder = builder.suggest("true");
22        }
23        if "false".starts_with(builder.remaining_lowercase()) {
24            builder = builder.suggest("false");
25        }
26        builder.build()
27    }
28
29    fn examples(&self) -> Vec<String> {
30        vec!["true".to_string(), "false".to_string()]
31    }
32}
33
34pub fn bool() -> impl ArgumentType {
35    Boolean
36}
37pub fn get_bool<S>(context: &CommandContext<S>, name: &str) -> Option<bool> {
38    context
39        .argument(name)
40        .expect("argument with name not found")
41        .downcast_ref::<bool>()
42        .cloned()
43}