tpex_api/
shared.rs

1use std::{fmt::Display, str::FromStr};
2
3use num_traits::FromPrimitive;
4use serde::{de::Visitor, Deserialize, Serialize};
5use tpex::PlayerId;
6use base64::prelude::*;
7
8#[repr(u8)]
9#[derive(PartialEq, Eq, PartialOrd, Ord, Debug, Copy, Clone)]
10#[derive(num_derive::FromPrimitive)]
11pub enum TokenLevel  {
12    /// The client can only get general pricing data
13    ReadOnly = 0,
14    /// The client can act on behalf of a user, but not for banker commands
15    ProxyOne = 1,
16    /// The client can act on behalf of any user, and perform admin commands
17    ProxyAll = 2,
18}
19impl Serialize for TokenLevel {
20    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
21    where S: serde::Serializer {
22        serializer.serialize_u64(*self as u64)
23    }
24}
25impl<'de> Deserialize<'de> for TokenLevel {
26    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
27    where D: serde::Deserializer<'de> {
28        struct Inner;
29        impl Visitor<'_> for Inner {
30            type Value = TokenLevel;
31
32            fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
33                write!(formatter, "an integer TokenLevel")
34            }
35
36            fn visit_u64<E>(self, v: u64) -> Result<Self::Value, E>
37            where E: serde::de::Error, {
38                TokenLevel::from_u64(v).ok_or(E::invalid_value(serde::de::Unexpected::Unsigned(v), &Self))
39            }
40        }
41        deserializer.deserialize_u64(Inner)
42    }
43}
44
45#[derive(PartialEq, Eq, Debug, Clone, Copy)]
46pub struct Token(pub [u8;16]);
47impl Token {
48    #[cfg(feature = "server")]
49    pub fn generate() -> Token {
50        let mut ret = Token(Default::default());
51        getrandom::fill(&mut ret.0).expect("Could not generate token");
52        ret
53    }
54}
55
56impl FromStr for Token {
57    type Err = base64::DecodeSliceError;
58
59    fn from_str(s: &str) -> Result<Self, Self::Err> {
60        let mut ret = Token(Default::default());
61        let len = BASE64_STANDARD_NO_PAD.decode_slice(s, &mut ret.0)?;
62        if len != ret.0.len() {
63            // FIXME: better error here
64            Err(base64::DecodeSliceError::OutputSliceTooSmall)
65        }
66        else {
67            Ok(ret)
68        }
69    }
70}
71impl Display for Token {
72    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
73        write!(f, "{}", BASE64_STANDARD_NO_PAD.encode(self.0))
74    }
75}
76impl Serialize for Token {
77    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
78    where
79        S: serde::Serializer {
80        serializer.serialize_str(&self.to_string())
81    }
82}
83impl<'de> Deserialize<'de> for Token {
84    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
85    where D: serde::Deserializer<'de> {
86        struct Inner;
87        impl Visitor<'_> for Inner {
88            type Value = Token;
89
90            fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
91                write!(formatter, "a base64-encoded token")
92            }
93
94            fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
95                where
96                    E: serde::de::Error, {
97                v.parse().map_err(E::custom)
98            }
99        }
100        deserializer.deserialize_str(Inner)
101    }
102}
103
104#[derive(PartialEq, Eq, Debug)]
105#[derive(serde::Serialize, serde::Deserialize)]
106pub struct TokenInfo {
107    pub token: Token,
108    pub user: PlayerId,
109    pub level: TokenLevel
110}
111
112#[derive(serde::Serialize, serde::Deserialize)]
113pub struct TokenPostArgs {
114    pub level: TokenLevel,
115    pub user: PlayerId
116}
117
118#[derive(serde::Serialize, serde::Deserialize)]
119pub struct TokenDeleteArgs {
120    pub token: Option<Token>
121}
122
123#[derive(Default)]
124#[derive(serde::Serialize, serde::Deserialize)]
125pub struct StateGetArgs {
126    pub from: Option<u64>
127}
128
129#[derive(Default)]
130#[derive(serde::Serialize, serde::Deserialize)]
131pub struct StatePatchArgs {
132    pub id: Option<u64>
133}
134#[derive(Default, Debug)]
135#[derive(serde::Serialize, serde::Deserialize)]
136pub struct ErrorInfo {
137    pub error: String
138}
139#[derive(Default, Debug)]
140#[derive(serde::Serialize, serde::Deserialize)]
141pub struct PollGetArgs {
142    pub id: u64
143}
144#[derive(Default, Debug)]
145#[derive(serde::Serialize, serde::Deserialize)]
146pub struct InspectBalanceGetArgs {
147    pub player: PlayerId
148}
149#[derive(Default, Debug)]
150#[derive(serde::Serialize, serde::Deserialize)]
151pub struct InspectAssetsGetArgs {
152    pub player: PlayerId
153}