scryfall/card/
legality.rs

1//! Enum describing the 4 states of legality a card can have.
2use std::cmp::Ordering;
3
4use serde::{Deserialize, Serialize};
5
6/// Enum describing the 4 states of legality a card can have.
7#[derive(Default, Serialize, Deserialize, Copy, Clone, Eq, PartialEq, Hash, Debug)]
8#[cfg_attr(test, serde(deny_unknown_fields))]
9#[serde(rename_all = "snake_case")]
10#[allow(missing_docs)]
11pub enum Legality {
12    Legal,
13    #[default]
14    NotLegal,
15    Restricted,
16    Banned,
17}
18
19impl PartialOrd for Legality {
20    fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
21        match (self, other) {
22            (Legality::NotLegal, _) | (_, Legality::NotLegal) => None,
23            (a, b) if a == b => Some(Ordering::Equal),
24            (Legality::Legal, _) => Some(Ordering::Greater),
25            (_, Legality::Legal) => Some(Ordering::Less),
26            (Legality::Restricted, Legality::Banned) => Some(Ordering::Greater),
27            (Legality::Banned, Legality::Restricted) => Some(Ordering::Less),
28            _ => unreachable!(),
29        }
30    }
31}
32
33#[cfg(test)]
34mod tests {
35    use super::*;
36
37    #[test]
38    fn compare_legalities() {
39        use Legality::*;
40        use Ordering::*;
41
42        let matrix = vec![
43            ((Legal, Legal), Some(Equal)),
44            ((Legal, NotLegal), None),
45            ((Legal, Restricted), Some(Greater)),
46            ((Legal, Banned), Some(Greater)),
47            ((NotLegal, Legal), None),
48            ((NotLegal, NotLegal), None),
49            ((NotLegal, Restricted), None),
50            ((NotLegal, Banned), None),
51            ((Restricted, Legal), Some(Less)),
52            ((Restricted, NotLegal), None),
53            ((Restricted, Restricted), Some(Equal)),
54            ((Restricted, Banned), Some(Greater)),
55            ((Banned, Legal), Some(Less)),
56            ((Banned, NotLegal), None),
57            ((Banned, Restricted), Some(Less)),
58            ((Banned, Banned), Some(Equal)),
59        ];
60
61        for ((a, b), order) in &matrix {
62            assert_eq!(&a.partial_cmp(b), order);
63        }
64    }
65}