azalea_inventory/components/
profile.rs

1use azalea_auth::game_profile::{
2    GameProfile, GameProfileProperties, SerializableProfileProperties,
3};
4use azalea_buf::AzBuf;
5use azalea_core::{codec_utils::*, resource_location::ResourceLocation};
6use serde::{Serialize, Serializer};
7use uuid::Uuid;
8
9#[derive(Clone, Debug, AzBuf, Default, PartialEq, Serialize)]
10#[doc(alias = "ResolvableProfile")]
11pub struct Profile {
12    #[serde(flatten)]
13    pub unpack: Box<PartialOrFullProfile>,
14    #[serde(flatten)]
15    pub skin_patch: Box<PlayerSkinPatch>,
16}
17
18#[derive(Clone, Debug, AzBuf, PartialEq, Serialize)]
19#[serde(untagged)]
20pub enum PartialOrFullProfile {
21    Partial(PartialProfile),
22    Full(GameProfile),
23}
24impl Default for PartialOrFullProfile {
25    fn default() -> Self {
26        Self::Partial(PartialProfile::default())
27    }
28}
29
30#[derive(Clone, Debug, AzBuf, Default, PartialEq, Serialize)]
31pub struct PartialProfile {
32    #[limit(16)]
33    #[serde(skip_serializing_if = "is_default")]
34    pub name: Option<String>,
35    #[serde(skip_serializing_if = "is_default")]
36    pub id: Option<Uuid>,
37    #[serde(serialize_with = "serialize_properties")]
38    #[serde(skip_serializing_if = "is_default")]
39    pub properties: GameProfileProperties,
40}
41fn serialize_properties<S: Serializer>(
42    properties: &GameProfileProperties,
43    serializer: S,
44) -> Result<S::Ok, S::Error> {
45    let serializable = SerializableProfileProperties::from(properties.clone());
46    serializable.serialize(serializer)
47}
48
49#[derive(Clone, Debug, AzBuf, Default, PartialEq, Serialize)]
50pub struct PlayerSkinPatch {
51    #[serde(rename = "texture")]
52    #[serde(skip_serializing_if = "is_default")]
53    pub body: Option<ResourceTexture>,
54    #[serde(skip_serializing_if = "is_default")]
55    pub cape: Option<ResourceTexture>,
56    #[serde(skip_serializing_if = "is_default")]
57    pub elytra: Option<ResourceTexture>,
58    #[serde(skip_serializing_if = "is_default")]
59    pub model: Option<PlayerModelType>,
60}
61
62#[derive(Clone, Debug, Copy, AzBuf, Default, PartialEq, Serialize)]
63#[serde(rename_all = "snake_case")]
64pub enum PlayerModelType {
65    #[default]
66    Wide,
67    Slim,
68}
69
70#[derive(Clone, Debug, AzBuf, PartialEq, Serialize)]
71#[serde(transparent)]
72pub struct ResourceTexture {
73    pub id: ResourceLocation,
74}