Skip to main content

screeps/enums/action_error_codes/
game_shard_error_codes.rs

1use std::{error::Error, fmt};
2
3use num_derive::FromPrimitive;
4use serde_repr::{Deserialize_repr, Serialize_repr};
5
6use crate::{constants::ErrorCode, FromReturnCode};
7
8/// Error codes used by
9/// [game::shard::activate_access](crate::game::shard::activate_access).
10///
11/// [Screeps API Docs](https://docs.screeps.com/api/#Game.shard.activateAccess).
12#[derive(
13    Debug, PartialEq, Eq, Clone, Copy, Hash, FromPrimitive, Deserialize_repr, Serialize_repr,
14)]
15#[repr(i8)]
16pub enum ActivateAccessErrorCode {
17    NotEnoughResources = -6,
18    InvalidTarget = -7,
19    Full = -8,
20}
21
22impl FromReturnCode for ActivateAccessErrorCode {
23    type Error = Self;
24
25    fn result_from_i8(val: i8) -> Result<(), Self::Error> {
26        let maybe_result = Self::try_result_from_i8(val);
27        #[cfg(feature = "unsafe-return-conversion")]
28        unsafe {
29            maybe_result.unwrap_unchecked()
30        }
31        #[cfg(not(feature = "unsafe-return-conversion"))]
32        maybe_result.unwrap()
33    }
34
35    fn try_result_from_i8(val: i8) -> Option<Result<(), Self::Error>> {
36        match val {
37            0 => Some(Ok(())),
38            -6 => Some(Err(ActivateAccessErrorCode::NotEnoughResources)),
39            -7 => Some(Err(ActivateAccessErrorCode::InvalidTarget)),
40            -8 => Some(Err(ActivateAccessErrorCode::Full)),
41            _ => None,
42        }
43    }
44}
45
46impl fmt::Display for ActivateAccessErrorCode {
47    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
48        let msg: &'static str = match self {
49            ActivateAccessErrorCode::NotEnoughResources => {
50                "your account does not have enough accessKey resource"
51            }
52            ActivateAccessErrorCode::InvalidTarget => "this shard is not restricted",
53            ActivateAccessErrorCode::Full => "your access is unlimited",
54        };
55
56        write!(f, "{}", msg)
57    }
58}
59
60impl Error for ActivateAccessErrorCode {}
61
62impl From<ActivateAccessErrorCode> for ErrorCode {
63    fn from(value: ActivateAccessErrorCode) -> Self {
64        // Safety: ActivateAccessErrorCode is repr(i8), so we can cast it to get the
65        // discriminant value, which will match the raw return code value that ErrorCode
66        // expects.   Ref: https://doc.rust-lang.org/reference/items/enumerations.html#r-items.enum.discriminant.coercion.intro
67        // Safety: ActivateAccessErrorCode discriminants are always error code values,
68        // and thus the Result returned here will always be an `Err` variant, so
69        // we can always extract the error without panicking
70        Self::result_from_i8(value as i8).unwrap_err()
71    }
72}