azalea_inventory/components/
profile.rs

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