From 292f075170a6d9c74a16e992c26c1db9c71d575b Mon Sep 17 00:00:00 2001 From: Shayne Hartford Date: Sat, 30 Nov 2024 16:37:44 -0500 Subject: [PATCH] Impl FromStr for BlockPos & Vec (again) --- azalea-core/src/position.rs | 46 +++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/azalea-core/src/position.rs b/azalea-core/src/position.rs index ccc81649..5948203f 100755 --- a/azalea-core/src/position.rs +++ b/azalea-core/src/position.rs @@ -3,6 +3,7 @@ //! The most common ones are [`Vec3`] and [`BlockPos`], which are usually used //! for entity positions and block positions, respectively. +use std::str::FromStr; use std::{ fmt, hash::Hash, @@ -682,6 +683,51 @@ impl AzaleaWrite for ChunkSectionPos { } } +fn parse_three_values(s: &str) -> Result<[T; 3], &'static str> +where + T: FromStr, + ::Err: fmt::Debug, +{ + let parts = s.split_whitespace().collect::>(); + if parts.len() != 3 { + return Err("Expected three values"); + } + + let x = parts[0].parse().map_err(|_| "Invalid X value")?; + let y = parts[1].parse().map_err(|_| "Invalid Y value")?; + let z = parts[2].parse().map_err(|_| "Invalid Z value")?; + + Ok([x, y, z]) +} + +/// Parses a string in the format "X Y Z" into a BlockPos. +/// +/// The input string should contain three integer values separated by spaces, +/// representing the x, y, and z components of the vector respectively. +/// This can be used to parse user input or from `BlockPos::to_string`. +impl FromStr for BlockPos { + type Err = &'static str; + + fn from_str(s: &str) -> Result { + let [x, y, z] = parse_three_values::(s)?; + Ok(BlockPos { x, y, z }) + } +} + +/// Parses a string in the format "X Y Z" into a Vec3. +/// +/// The input string should contain three floating-point values separated by +/// spaces, representing the x, y, and z components of the vector respectively. +/// This can be used to parse user input or from `Vec3::to_string`. +impl FromStr for Vec3 { + type Err = &'static str; + + fn from_str(s: &str) -> Result { + let [x, y, z] = parse_three_values::(s)?; + Ok(Vec3 { x, y, z }) + } +} + #[cfg(test)] mod tests { use super::*;