boseiju/ability_tree/card_layout/
normal_layout.rs1#[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}