manabrew_engine/replacement/replacement_layer.rs
1//! Replacement effect layer ordering.
2//!
3//! Mirrors Java `ReplacementLayer.java` in `forge/game/replacement/`.
4
5use serde::{Deserialize, Serialize};
6
7/// CR 614 / CR 616 layer ordering for replacement effects.
8///
9/// Multiple replacement effects that apply to the same event are applied in
10/// the order below. Within the same layer the affected player chooses the order.
11///
12/// Reference: CR 616.1, Java `ReplacementLayer.java`.
13#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)]
14pub enum ReplacementLayer {
15 /// CR 614.17 — effects that say an event "can't happen" (highest priority).
16 CantHappen = 0,
17 /// CR 616.1b — control-changing replacement effects.
18 Control = 1,
19 /// CR 616.1c — copy replacement effects.
20 Copy = 2,
21 /// CR 616.1d — transform replacement effects.
22 Transform = 3,
23 /// All other replacement effects (damage prevention, zone rerouting, etc.).
24 Other = 4,
25}
26
27impl ReplacementLayer {
28 /// Case-insensitive `Layer$` value parser. Mirrors Java
29 /// `ReplacementLayer.smartValueOf()`. Returns `None` if unrecognised.
30 pub fn smart_value_of(value: &str) -> Option<Self> {
31 match value.trim().to_ascii_lowercase().as_str() {
32 "canthappen" => Some(Self::CantHappen),
33 "control" => Some(Self::Control),
34 "copy" => Some(Self::Copy),
35 "transform" => Some(Self::Transform),
36 "other" => Some(Self::Other),
37 _ => None,
38 }
39 }
40}