Skip to main content

nil_server_database/
error.rs

1// Copyright (C) Call of Nil contributors
2// SPDX-License-Identifier: AGPL-3.0-only
3
4use 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}