1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
//! Module for types in Magic: the Gathering

// TODO
pub struct ManaCost {

}

// TODO
pub struct ColorIndicator {

}

// 205.2a The card types are artifact, conspiracy, creature, enchantment, instant,
// land, phenomenon, plane, planeswalker, scheme, sorcery, tribal, and vanguard.
// See section 3, “Card Types.”
pub enum CardType {
    Artifact,
    Conspiracy,
    Creature,
    Enchantment,
    Instant,
    Land,
    Phenomenon,
    Plane,
    Planeswalker,
    Scheme,
    Sorcery,
    Tribal,
    Vanguard,

    // For custom implementations of cards, a Custom option is provided.
    Custom(String)
}

// 205.4a A card can also have one or more supertypes. These are printed directly
// before its card types. The supertypes are basic, legendary, ongoing, snow, and
// world.
pub enum SuperType {
    Basic,
    Legendary,
    Ongoing,
    Snow,
    World,
    Custom(String)
}

// TODO
pub enum SubType {
    Custom(String)
}

// 205.1. The type line is printed directly below the illustration. It contains the
// card’s card type(s). It also contains the card’s subtype(s) and supertype(s), if
// applicable.
pub struct TypeLine {
    pub card_type: Vec<CardType>,
    pub super_type: Vec<SuperType>,
    pub sub_type: Vec<SubType>,
}

// 200.1. The parts of a card are name, mana cost, illustration, color indicator,
// type line, expansion symbol, text box, power and toughness, loyalty, hand modifier,
// life modifier, illustration credit, legal text, and collector number. Some cards
// may have more than one of any or all of these parts.
pub trait Card {
    // Gets the card name.
    fn name(&self) -> String;

    // Gets the card mana cost, if it has one.
    fn mana_cost(&self) -> Option<ManaCost>;

    // Gets the card's illustration, if there is one.
    fn illustration(&self) -> Option<String>;

    // Gets the card's color indicator, if it has one.
    fn color_indicator(&self) -> Option<ColorIndicator>;

    // Gets the card's type line.
    fn type_line(&self) -> TypeLine;

    // Gets the card's expansion symbol
    // TODO

    // Gets the card's text box
    // TODO

    // Gets the card's power
    // TODO

    // Gets the card's toughness
    // TODO

    // Gets the card's loyalty
    // TODO

    // Gets the card's hand modifier
    // TODO

    // Gets the card's life modifier
    // TODO

    // Gets the card's illustration credit
    // TODO

    // Gets the card's legal text
    // TODO

    // Gets the card's collector number
    // TODO
}

#[cfg(test)]
mod tests {
    use super::*;

    #[derive(Default)]
    struct TestCard {}

    impl Card for TestCard {
        fn name(&self) -> String {
            "TestCard".to_string()
        }
        fn mana_cost(&self) -> Option<ManaCost> {
            None
        }
        fn illustration(&self) -> Option<String> {
            None
        }
        fn color_indicator(&self) -> Option<ColorIndicator> {
            None
        }
        fn type_line(&self) -> TypeLine {
            TypeLine {
                card_type: vec!(CardType::Custom("TestCard".to_string())),
                super_type: vec!(),
                sub_type: vec!(),
            }
        }
    }

    #[test]
    fn test_card_name() {
        let tc = TestCard::default();
        assert_eq!(tc.name(), "TestCard");
    }
}