nil_server_database/
error.rs1use crate::sql_types::game_id::GameId;
5use crate::sql_types::id::UserId;
6use crate::sql_types::player_id::db_PlayerId;
7use either::Either;
8use serde::Serialize;
9use serde::ser::Serializer;
10use std::convert::Infallible;
11use std::error::Error as StdError;
12use std::io;
13use std::result::Result as StdResult;
14use tokio::task::JoinError;
15
16pub use diesel::result::Error as DieselError;
17pub use nil_core::error::Error as CoreError;
18
19#[doc(hidden)]
20pub type Result<T, E = Error> = StdResult<T, E>;
21#[doc(hidden)]
22pub type AnyResult<T> = anyhow::Result<T>;
23
24#[derive(Debug, thiserror::Error)]
25pub enum Error {
26 #[error("Game not found")]
27 GameNotFound(GameId),
28
29 #[error("Invalid password")]
30 InvalidPassword,
31
32 #[error("Invalid username: \"{0}\"")]
33 InvalidUsername(db_PlayerId),
34
35 #[error("Migration failed: {0}")]
36 MigrationFailed(Box<dyn StdError + Send + Sync>),
37
38 #[error("User already exists: \"{0}\"")]
39 UserAlreadyExists(db_PlayerId),
40
41 #[error("User not found")]
42 UserNotFound(Either<db_PlayerId, UserId>),
43
44 #[error(transparent)]
45 Core(#[from] CoreError),
46 #[error(transparent)]
47 Deadpool(#[from] diesel_async::pooled_connection::deadpool::PoolError),
48 #[error(transparent)]
49 DeadpoolBuild(#[from] diesel_async::pooled_connection::deadpool::BuildError),
50 #[error(transparent)]
51 Diesel(#[from] diesel::result::Error),
52 #[error(transparent)]
53 DieselConnection(#[from] diesel::ConnectionError),
54 #[error(transparent)]
55 Io(#[from] io::Error),
56 #[error(transparent)]
57 Jiff(#[from] jiff::Error),
58 #[error(transparent)]
59 Unknown(#[from] anyhow::Error),
60}
61
62impl Serialize for Error {
63 fn serialize<S>(&self, serializer: S) -> StdResult<S::Ok, S::Error>
64 where
65 S: Serializer,
66 {
67 serializer.serialize_str(self.to_string().as_str())
68 }
69}
70
71impl<E> From<Result<Infallible, E>> for Error
72where
73 E: Into<Error>,
74{
75 fn from(value: Result<Infallible, E>) -> Self {
76 value.unwrap_err().into()
77 }
78}
79
80impl From<JoinError> for Error {
81 fn from(err: JoinError) -> Self {
82 Self::Io(io::Error::from(err))
83 }
84}