mirror of
https://github.com/italicsjenga/valence.git
synced 2025-01-10 06:41:30 +11:00
Re-visit From
impl for native data types found in NBT data format. (#169)
This commit is contained in:
parent
740778ec41
commit
c73abacc98
|
@ -36,7 +36,7 @@ thiserror = "1.0.35"
|
||||||
tracing = "0.1.37"
|
tracing = "0.1.37"
|
||||||
url = { version = "2.2.2", features = ["serde"] }
|
url = { version = "2.2.2", features = ["serde"] }
|
||||||
uuid = { version = "1.1.2", features = ["serde"] }
|
uuid = { version = "1.1.2", features = ["serde"] }
|
||||||
valence_nbt = { version = "0.4.0", path = "valence_nbt" }
|
valence_nbt = { version = "0.5.0", path = "valence_nbt" }
|
||||||
valence_protocol = { version = "0.1.0", path = "valence_protocol", features = ["encryption", "compression"] }
|
valence_protocol = { version = "0.1.0", path = "valence_protocol", features = ["encryption", "compression"] }
|
||||||
vek = "0.15.8"
|
vek = "0.15.8"
|
||||||
|
|
||||||
|
|
|
@ -6,7 +6,7 @@ repository = "https://github.com/valence-rs/valence/tree/main/valence_nbt"
|
||||||
readme = "README.md"
|
readme = "README.md"
|
||||||
license = "MIT"
|
license = "MIT"
|
||||||
keywords = ["nbt", "minecraft", "serialization"]
|
keywords = ["nbt", "minecraft", "serialization"]
|
||||||
version = "0.4.0"
|
version = "0.5.0"
|
||||||
authors = ["Ryan Johnson <ryanj00a@gmail.com>"]
|
authors = ["Ryan Johnson <ryanj00a@gmail.com>"]
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
|
|
||||||
|
|
|
@ -72,6 +72,56 @@ impl List {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// We can not create new identities in stable Rust using macros, so we provide
|
||||||
|
/// them in the macro invocation itself.
|
||||||
|
macro_rules! nbt_conversion {
|
||||||
|
( $($nbt_type:ident = $value_type:ty => $is_function:ident $as_function:ident $as_mut_function:ident $into_function:ident)+ ) => {
|
||||||
|
$(
|
||||||
|
pub fn $is_function(&self) -> bool {
|
||||||
|
self.$as_function().is_some()
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn $as_function(&self) -> Option<&$value_type> {
|
||||||
|
match self {
|
||||||
|
Self::$nbt_type(value) => Some(value),
|
||||||
|
_ => None
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn $as_mut_function(&mut self) -> Option<&mut $value_type> {
|
||||||
|
match self {
|
||||||
|
Self::$nbt_type(value) => Some(value),
|
||||||
|
_ => None
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn $into_function(self) -> Option<$value_type> {
|
||||||
|
match self {
|
||||||
|
Self::$nbt_type(value) => Some(value),
|
||||||
|
_ => None
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)*
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Value {
|
||||||
|
nbt_conversion! {
|
||||||
|
Byte = i8 => is_byte as_byte as_byte_mut into_byte
|
||||||
|
Short = i16 => is_short as_short as_short_mut into_short
|
||||||
|
Int = i32 => is_int as_int as_int_mut into_int
|
||||||
|
Long = i64 => is_long as_long as_long_mut into_long
|
||||||
|
Float = f32 => is_float as_float as_float_mut into_float
|
||||||
|
Double = f64 => is_double as_double as_double_mut into_double
|
||||||
|
ByteArray = Vec<i8> => is_byte_array as_byte_array as_byte_array_mut into_byte_array
|
||||||
|
String = String => is_string as_string as_string_mut into_string
|
||||||
|
List = List => is_list as_list as_list_mut into_list
|
||||||
|
Compound = Compound => is_compound as_compound as_compound_mut into_compound
|
||||||
|
IntArray = Vec<i32> => is_int_array as_int_array as_int_array_mut into_int_array
|
||||||
|
LongArray = Vec<i64> => is_long_array as_long_array as_long_array_mut into_long_array
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl From<i8> for Value {
|
impl From<i8> for Value {
|
||||||
fn from(v: i8) -> Self {
|
fn from(v: i8) -> Self {
|
||||||
Self::Byte(v)
|
Self::Byte(v)
|
||||||
|
@ -234,123 +284,3 @@ impl From<Vec<Vec<i64>>> for List {
|
||||||
List::LongArray(v)
|
List::LongArray(v)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<Value> for Option<i8> {
|
|
||||||
fn from(value: Value) -> Self {
|
|
||||||
if let Value::Byte(b) = value {
|
|
||||||
Some(b)
|
|
||||||
} else {
|
|
||||||
None
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<Value> for Option<i16> {
|
|
||||||
fn from(value: Value) -> Self {
|
|
||||||
if let Value::Short(val) = value {
|
|
||||||
Some(val)
|
|
||||||
} else {
|
|
||||||
None
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<Value> for Option<i32> {
|
|
||||||
fn from(value: Value) -> Self {
|
|
||||||
if let Value::Int(val) = value {
|
|
||||||
Some(val)
|
|
||||||
} else {
|
|
||||||
None
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<Value> for Option<i64> {
|
|
||||||
fn from(value: Value) -> Self {
|
|
||||||
if let Value::Long(val) = value {
|
|
||||||
Some(val)
|
|
||||||
} else {
|
|
||||||
None
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<Value> for Option<f32> {
|
|
||||||
fn from(value: Value) -> Self {
|
|
||||||
if let Value::Float(val) = value {
|
|
||||||
Some(val)
|
|
||||||
} else {
|
|
||||||
None
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<Value> for Option<f64> {
|
|
||||||
fn from(value: Value) -> Self {
|
|
||||||
if let Value::Double(val) = value {
|
|
||||||
Some(val)
|
|
||||||
} else {
|
|
||||||
None
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<Value> for Option<Vec<i8>> {
|
|
||||||
fn from(value: Value) -> Self {
|
|
||||||
if let Value::ByteArray(val) = value {
|
|
||||||
Some(val)
|
|
||||||
} else {
|
|
||||||
None
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<Value> for Option<String> {
|
|
||||||
fn from(value: Value) -> Self {
|
|
||||||
if let Value::String(val) = value {
|
|
||||||
Some(val)
|
|
||||||
} else {
|
|
||||||
None
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<Value> for Option<List> {
|
|
||||||
fn from(value: Value) -> Self {
|
|
||||||
if let Value::List(val) = value {
|
|
||||||
Some(val)
|
|
||||||
} else {
|
|
||||||
None
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<Value> for Option<Compound> {
|
|
||||||
fn from(value: Value) -> Self {
|
|
||||||
if let Value::Compound(val) = value {
|
|
||||||
Some(val)
|
|
||||||
} else {
|
|
||||||
None
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<Value> for Option<Vec<i32>> {
|
|
||||||
fn from(value: Value) -> Self {
|
|
||||||
if let Value::IntArray(val) = value {
|
|
||||||
Some(val)
|
|
||||||
} else {
|
|
||||||
None
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<Value> for Option<Vec<i64>> {
|
|
||||||
fn from(value: Value) -> Self {
|
|
||||||
if let Value::LongArray(val) = value {
|
|
||||||
Some(val)
|
|
||||||
} else {
|
|
||||||
None
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -18,7 +18,7 @@ serde_json = "1.0.87"
|
||||||
thiserror = "1.0.37"
|
thiserror = "1.0.37"
|
||||||
uuid = "1.2.1"
|
uuid = "1.2.1"
|
||||||
valence_derive = { version = "0.1.0", path = "../valence_derive" }
|
valence_derive = { version = "0.1.0", path = "../valence_derive" }
|
||||||
valence_nbt = { version = "0.4.0", path = "../valence_nbt" }
|
valence_nbt = { version = "0.5.0", path = "../valence_nbt" }
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
rand = "0.8.5"
|
rand = "0.8.5"
|
||||||
|
|
Loading…
Reference in a new issue