Skip to main content

steel_core/command/execution/
nbt.rs

1//! NBT path command arguments.
2
3use steel_utils::nbt::{NbtPath, parse_nbt_path_argument as parse_path};
4use text_components::TextComponent;
5
6use crate::command::brigadier::{CommandSyntaxError, CommandSyntaxErrorKind, StringReader};
7
8pub(super) fn parse_nbt_path(reader: &mut StringReader<'_>) -> Result<NbtPath, CommandSyntaxError> {
9    match parse_path(reader.remaining()) {
10        Ok((path, consumed)) => {
11            if !reader.advance_bytes(consumed) {
12                return Err(dynamic_error(reader, "Invalid NBT path cursor"));
13            }
14            Ok(path)
15        }
16        Err(error) => {
17            if !reader.advance_bytes(error.cursor()) {
18                return Err(dynamic_error(reader, "Invalid NBT path cursor"));
19            }
20            Err(dynamic_error(reader, error.component()))
21        }
22    }
23}
24
25fn dynamic_error(
26    reader: &StringReader<'_>,
27    message: impl Into<TextComponent>,
28) -> CommandSyntaxError {
29    reader.error(CommandSyntaxErrorKind::Dynamic(Box::new(message.into())))
30}