Skip to main content

entropy_game/
err.rs

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 error <- uid::{0} or password")]
58    // AuthError(i32),
59
60    #[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}