boseiju/ability_tree/card_layout/
normal_layout.rs

1#[derive(Debug, Clone)]
2#[derive(serde::Serialize, serde::Deserialize)]
3pub struct NormalLayout {
4    pub mana_cost: Option<crate::ability_tree::terminals::ManaCost>,
5    pub card_type: crate::ability_tree::type_line::TypeLine,
6    pub abilities: crate::AbilityTree,
7    #[cfg(feature = "spanned_tree")]
8    pub span: crate::ability_tree::span::TreeSpan,
9}
10
11impl super::LayoutImpl for NormalLayout {
12    fn card_types(&self) -> arrayvec::ArrayVec<mtg_data::CardType, 4> {
13        self.card_type.card_types()
14    }
15
16    fn mana_value(&self) -> usize {
17        self.mana_cost.as_ref().map(|cost| cost.mana_value()).unwrap_or(0)
18    }
19
20    #[cfg(feature = "parser")]
21    fn from_raw_card(raw_card: &mtg_cardbase::Card) -> Result<Self, String> {
22        use crate::lexer::IntoToken;
23
24        let type_line_span = crate::lexer::Span {
25            start: 0,
26            length: raw_card.type_line.len(),
27            text: raw_card.type_line.as_str(),
28        };
29
30        Ok(NormalLayout {
31            mana_cost: match raw_card.mana_cost.as_ref() {
32                Some(mana_cost) => {
33                    use crate::lexer::IntoToken;
34
35                    let mana_cost_span = crate::lexer::Span {
36                        start: 0,
37                        length: mana_cost.len(),
38                        text: mana_cost,
39                    };
40                    Some(
41                        crate::ability_tree::terminals::ManaCost::try_from_span(&mana_cost_span)
42                            .ok_or_else(|| format!("Failed to parse mana cost from: {mana_cost}"))?,
43                    )
44                }
45                None => None,
46            },
47            card_type: crate::ability_tree::type_line::TypeLine::try_from_span(&type_line_span)
48                .ok_or_else(|| format!("Failed to parse card type: {}", raw_card.type_line))?,
49            abilities: match raw_card.oracle_text.as_ref() {
50                Some(oracle_text) => crate::AbilityTree::from_oracle_text(oracle_text, &raw_card.name)
51                    .map_err(|e| format!("Failed to parse oracle text to ability tree: {e}"))?,
52                None => crate::AbilityTree::empty(),
53            },
54            #[cfg(feature = "spanned_tree")]
55            span: Default::default(),
56        })
57    }
58
59    fn layout_debug_display<W: std::io::Write>(&self, _output: &mut W) -> std::io::Result<()> {
60        unimplemented!()
61    }
62}