1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
use serde::{de::Deserializer, ser::Serializer};
use serde_derive::Deserialize;
use std::collections::HashMap;
use uuid::Uuid;
#[derive(Deserialize, Debug)]
#[serde(rename_all = "camelCase")]
pub struct User {
pub id: Uuid,
pub username: String,
#[serde(deserialize_with = "properties_parser")]
pub properties: HashMap<String, String>,
}
#[derive(Deserialize, Debug)]
#[serde(rename_all = "camelCase")]
pub struct Profile {
pub agent: Option<String>,
pub id: Uuid,
pub name: String,
#[serde(default)]
pub legacy: bool,
}
#[derive(Deserialize, Debug)]
#[serde(rename_all = "camelCase")]
pub struct ErrorMessage {
pub error: String,
pub error_message: String,
pub cause: Option<String>,
}
fn properties_parser<'de, D>(deserializer: D) -> Result<HashMap<String, String>, D::Error>
where
D: Deserializer<'de>,
{
use serde::de::{SeqAccess, Visitor};
use std::fmt;
struct PropertiesParser;
#[derive(Deserialize)]
#[serde(rename_all = "camelCase")]
struct Property {
name: String,
value: String,
}
impl<'de> Visitor<'de> for PropertiesParser {
type Value = HashMap<String, String>;
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
formatter.write_str("mojang properties, which separate name and value into two fields")
}
fn visit_seq<S>(self, mut seq: S) -> Result<Self::Value, S::Error>
where
S: SeqAccess<'de>,
{
let mut map = HashMap::new();
while let Some(property) = seq.next_element::<Property>()? {
map.insert(property.name, property.value);
}
Ok(map)
}
}
deserializer.deserialize_seq(PropertiesParser)
}
pub(crate) fn serialize_uuid_simple<S>(uuid: &Uuid, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
serializer.serialize_str(&uuid.to_simple().to_string())
}