use crate::content::numeric_enum;
numeric_enum! {
    pub enum LogicField for u8 | TryFromU8Error
    {
        TotalItems, FirstItem, TotalLiquids, TotalPower, ItemCapacity, LiquidCapacity, PowerCapacity, PowerNetCapacity, PowerNetStored, PowerNetIn,
        PowerNetOut, Ammo, AmmoCapacity, Health, MaxHealth, Heat, Efficiency, Progress, Timescale, Rotation, PosX, PosY, ShootX, ShootY, Size, Dead, Range,
        Shooting, Boosting, MineX, MineY, Mining, Speed, Team, Type, Flag, Controlled, Controller, Name, PayloadCount, PayloadType, Enabled, Shoot, ShootP,
        Config, Color
    }
}
impl LogicField {
    #[must_use]
    pub const fn is_readable(self) -> bool {
        use LogicField::{
            Ammo, AmmoCapacity, Boosting, Color, Controlled, Controller, Dead, Efficiency, Enabled,
            FirstItem, Flag, Health, Heat, ItemCapacity, LiquidCapacity, MaxHealth, MineX, MineY,
            Mining, Name, PayloadCount, PayloadType, PosX, PosY, PowerCapacity, PowerNetCapacity,
            PowerNetIn, PowerNetOut, PowerNetStored, Progress, Range, Rotation, ShootX, ShootY,
            Shooting, Size, Speed, Team, Timescale, TotalItems, TotalLiquids, TotalPower, Type,
        };
        matches!(
            self,
            TotalItems
                | FirstItem
                | TotalLiquids
                | TotalPower
                | ItemCapacity
                | LiquidCapacity
                | PowerCapacity
                | PowerNetCapacity
                | PowerNetStored
                | PowerNetIn
                | PowerNetOut
                | Ammo
                | AmmoCapacity
                | Health
                | MaxHealth
                | Heat
                | Efficiency
                | Progress
                | Timescale
                | Rotation
                | PosX
                | PosY
                | ShootX
                | ShootY
                | Size
                | Dead
                | Range
                | Shooting
                | Boosting
                | MineX
                | MineY
                | Mining
                | Speed
                | Team
                | Type
                | Flag
                | Controlled
                | Controller
                | Name
                | PayloadCount
                | PayloadType
                | Enabled
                | Color
        )
    }
    #[must_use]
    pub const fn is_writable(self) -> bool {
        use LogicField::{Color, Config, Enabled, Shoot, ShootP};
        matches!(self, Enabled | Shoot | ShootP | Config | Color)
    }
}