diff options
| author | Shayne Hartford <shaybox@shaybox.com> | 2024-10-21 18:04:46 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-10-21 17:04:46 -0500 |
| commit | 5535877a4bddcdc30ef8f752a90e6845b308c3c2 (patch) | |
| tree | 3619a0106691c8d56ddf2b92d73047d13f0bea0c /azalea-core/src | |
| parent | 58d14857335e130938bde66b5a8b1c6013fe2892 (diff) | |
| download | azalea-drasl-5535877a4bddcdc30ef8f752a90e6845b308c3c2.tar.xz | |
Impl FromStr for BlockPos & Vec (#174)
* Impl FromStr for BlockPos & Vec
(cherry picked from commit 288db1ca303c801c189f950fa99d5ae8369235c4)
* Add comments
Diffstat (limited to 'azalea-core/src')
| -rwxr-xr-x | azalea-core/src/position.rs | 49 |
1 files changed, 47 insertions, 2 deletions
diff --git a/azalea-core/src/position.rs b/azalea-core/src/position.rs index 310d0390..d87e21a7 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 crate::resource_location::ResourceLocation; use azalea_buf::{BufReadError, McBuf, McBufReadable, McBufWritable}; #[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; @@ -11,10 +12,9 @@ use std::{ hash::Hash, io::{Cursor, Write}, ops::{Add, AddAssign, Mul, Rem, Sub}, + str::FromStr, }; -use crate::resource_location::ResourceLocation; - macro_rules! vec3_impl { ($name:ident, $type:ty) => { impl $name { @@ -643,6 +643,51 @@ impl McBufWritable 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::*; |
