diff options
| author | Shayne Hartford <shaybox@shaybox.com> | 2024-11-30 16:46:39 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-11-30 15:46:39 -0600 |
| commit | 944fe5c6f888ebdcb7354cc5e6ab6a7414daec99 (patch) | |
| tree | cb6599149dcc092fb2434cd998de35bb21ad073c | |
| parent | f364ad6b210f93f53b6ee8f73c259622e9f37421 (diff) | |
| download | azalea-drasl-944fe5c6f888ebdcb7354cc5e6ab6a7414daec99.tar.xz | |
Impl FromStr for BlockPos & Vec (again) (#191)
| -rwxr-xr-x | azalea-core/src/position.rs | 46 |
1 files changed, 46 insertions, 0 deletions
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<T>(s: &str) -> Result<[T; 3], &'static str> +where + T: FromStr, + <T as FromStr>::Err: fmt::Debug, +{ + let parts = s.split_whitespace().collect::<Vec<_>>(); + 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<Self, Self::Err> { + let [x, y, z] = parse_three_values::<i32>(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<Self, Self::Err> { + let [x, y, z] = parse_three_values::<f64>(s)?; + Ok(Vec3 { x, y, z }) + } +} + #[cfg(test)] mod tests { use super::*; |
