mcsr_ranked_api/user/
identifier.rs

1use std::{fmt::Display, num::NonZeroU64};
2
3use serde::Serialize;
4use uuid::Uuid;
5
6/// User identifier for API user lookup
7#[derive(Debug, Clone, Copy, PartialEq, Eq)]
8pub enum UserIdentifier<'a> {
9	/// User's minecraft UUID
10	Uuid(Uuid),
11	/// User's minecraft IGN
12	Nickname(&'a str),
13	/// User's discord snowflake id
14	DiscordId(u64),
15}
16
17impl From<u64> for UserIdentifier<'_> {
18	fn from(value: u64) -> Self {
19		Self::DiscordId(value)
20	}
21}
22impl From<NonZeroU64> for UserIdentifier<'_> {
23	fn from(value: NonZeroU64) -> Self {
24		Self::DiscordId(value.get())
25	}
26}
27impl From<Uuid> for UserIdentifier<'_> {
28	fn from(value: Uuid) -> Self {
29		Self::Uuid(value)
30	}
31}
32impl<'a> From<&'a str> for UserIdentifier<'a> {
33	fn from(value: &'a str) -> Self {
34		Self::Nickname(value)
35	}
36}
37
38impl Display for UserIdentifier<'_> {
39	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
40		match &self {
41			Self::Uuid(uuid) => write!(f, "{uuid}"),
42			Self::Nickname(name) => write!(f, "{name}"),
43			Self::DiscordId(snowflake) => write!(f, "discord.{snowflake}"),
44		}
45	}
46}
47
48impl Serialize for UserIdentifier<'_> {
49	fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
50	where
51		S: serde::Serializer,
52	{
53		serializer.serialize_newtype_struct("UserIdentifier", &self.to_string())
54	}
55}