1use crate::tags::Tag;
2use std::collections::HashMap;
3
4pub trait ToTag {
6 fn into_tag(self) -> Tag;
7}
8
9pub trait FromTag: Sized {
11 fn from_tag(tag: Tag) -> Option<Self>;
12 fn from_borrowed_tag(tag: &Tag) -> Option<&Self>;
13}
14
15
16impl ToTag for Tag { fn into_tag(self) -> Tag { self }}
17impl FromTag for Tag { fn from_tag(tag: Tag) -> Option<Self> { Some(tag) } fn from_borrowed_tag(tag: &Tag) -> Option<&Self> { Some(&tag) } }
18
19impl ToTag for i8 { fn into_tag(self) -> Tag { Tag::Byte(self) } }
20impl ToTag for i16 { fn into_tag(self) -> Tag { Tag::Short(self) } }
21impl ToTag for i32 { fn into_tag(self) -> Tag { Tag::Int(self) } }
22impl ToTag for i64 { fn into_tag(self) -> Tag { Tag::Long(self) } }
23impl ToTag for f32 { fn into_tag(self) -> Tag { Tag::Float(self) } }
24impl ToTag for f64 { fn into_tag(self) -> Tag { Tag::Double(self) } }
25impl ToTag for String { fn into_tag(self) -> Tag { Tag::String(self) } }
26impl ToTag for &str { fn into_tag(self) -> Tag { Tag::String(self.to_string()) } }
27
28impl ToTag for Vec<i8> { fn into_tag(self) -> Tag { Tag::ByteArray(self) }}
29impl ToTag for Vec<i32> { fn into_tag(self) -> Tag { Tag::IntArray(self) }}
30impl ToTag for Vec<i64> { fn into_tag(self) -> Tag { Tag::LongArray(self) }}
31
32impl<T: ToTag> ToTag for HashMap<String, T> { fn into_tag(self) -> Tag { Tag::Compound(self.into_iter().map(|(k, v)| (k, v.into_tag())).collect()) } }
34
35impl FromTag for i8 { fn from_tag(tag: Tag) -> Option<Self> { if let Tag::Byte(v) = tag { Some(v) } else { None } } fn from_borrowed_tag(tag: &Tag) -> Option<&Self> { if let Tag::Byte(v) = tag { Some(v) } else { None } } }
36impl FromTag for i16 { fn from_tag(tag: Tag) -> Option<Self> { if let Tag::Short(v) = tag { Some(v) } else { None } } fn from_borrowed_tag(tag: &Tag) -> Option<&Self> { if let Tag::Short(v) = tag { Some(v) } else { None } } }
37impl FromTag for i32 { fn from_tag(tag: Tag) -> Option<Self> { if let Tag::Int(v) = tag { Some(v) } else { None } } fn from_borrowed_tag(tag: &Tag) -> Option<&Self> { if let Tag::Int(v) = tag { Some(v) } else { None } } }
38impl FromTag for i64 { fn from_tag(tag: Tag) -> Option<Self> { if let Tag::Long(v) = tag { Some(v) } else { None } } fn from_borrowed_tag(tag: &Tag) -> Option<&Self> { if let Tag::Long(v) = tag { Some(v) } else { None } } }
39impl FromTag for f32 { fn from_tag(tag: Tag) -> Option<Self> { if let Tag::Float(v) = tag { Some(v) } else { None } } fn from_borrowed_tag(tag: &Tag) -> Option<&Self> { if let Tag::Float(v) = tag { Some(v) } else { None } } }
40impl FromTag for f64 { fn from_tag(tag: Tag) -> Option<Self> { if let Tag::Double(v) = tag { Some(v) } else { None } } fn from_borrowed_tag(tag: &Tag) -> Option<&Self> { if let Tag::Double(v) = tag { Some(v) } else { None } } }
41impl FromTag for String { fn from_tag(tag: Tag) -> Option<Self> { if let Tag::String(v) = tag { Some(v) } else { None } } fn from_borrowed_tag(tag: &Tag) -> Option<&Self> { if let Tag::String(v) = tag { Some(v) } else { None } } }