steel_core/command/execution/
nbt.rs1use 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}