1use pg_embed_alternative::pg_errors::PgEmbedError;
2use sea_orm::DbErr;
3use thiserror::Error;
4
5use entropy_base::grid::{navi, NodeID};
6
7#[derive(Error, Debug)]
8pub enum ModelError {
9 #[error("backend database error <- {0}")]
10 Database(#[from] DbErr),
11 #[error("error while parse model <- {desc}")]
12 Parse { desc: String },
13 #[error("data out of limit::{limit_type} <- {desc}")]
14 OutOfLimit {
15 desc: String,
16 limit_type: &'static str,
17 },
18}
19
20#[derive(Error, Debug)]
21pub enum OperationError {
22 #[error(transparent)]
23 Model(#[from] ModelError),
24 #[error("energy not enough <- require:{require}, reserve:{reserve}")]
25 EnergyNotEnough { require: i64, reserve: i64 },
26 #[error("player already has guest <- only player with no guest can spawn free guest")]
27 AlreadyHasGuest,
28 #[error("player not exist or check your password <- request player id:{0}")]
29 PlayerNotExist(i32),
30 #[error("guest not exist <- request guest id:{0}")]
31 GuestNotExist(i32),
32 #[error("navi direction not allowed <- request direction:{0:?}")]
33 DirectionNotAllowed(navi::Direction),
34 #[error("cannot exhaust heat <- node:{0:?}")]
35 NodeTemperatureTooHigh(NodeID),
36 #[error("index longer than node:{node:?} index <- required:{require}, max length:{max}")]
37 CellIndexOutOfRange {
38 node: NodeID,
39 require: usize,
40 max: usize,
41 },
42 #[error("cannot exhaust heat <- index:{index}@node:{node:?}")]
43 CellTemperatureTooHigh { node: NodeID, index: usize },
44}
45
46impl From<DbErr> for OperationError {
47 fn from(value: DbErr) -> Self {
48 OperationError::Model(ModelError::Database(value))
49 }
50}
51
52#[derive(Debug, Error)]
53pub enum ApiError {
54 #[error(transparent)]
55 Operation(#[from] OperationError),
56
57 #[error("authorization header error")]
61 AuthHeader,
62}
63
64impl From<DbErr> for ApiError {
65 fn from(value: DbErr) -> Self {
66 ApiError::Operation(OperationError::Model(ModelError::Database(value)))
67 }
68}
69
70#[derive(Debug, Error)]
71pub enum RuntimeError {
72 #[error(transparent)]
73 Database(#[from] DbErr),
74 #[error(transparent)]
75 IO(#[from] std::io::Error),
76 #[error(transparent)]
77 Config(#[from] toml::de::Error),
78 #[error(transparent)]
79 UrlParse(#[from] url::ParseError),
80 #[error(transparent)]
81 PgEmbed(#[from] PgEmbedError),
82}