scryfall/card/
legality.rs1use std::cmp::Ordering;
3
4use serde::{Deserialize, Serialize};
5
6#[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}