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
use crate::decklist::unpopulated_decklist::UnpopulatedDecklist;
use std::collections::VecDeque;
use std::ops::Index;

impl UnpopulatedDecklist {
    pub fn parse_raw<S: ToString>(data: S) -> Option<Self> {
        let mut main = vec![];
        let mut sideboard = vec![];
        let mut writing = true;
        for line in data.to_string().lines() {
            if line.is_empty() {
                continue;
            }
            if line == "Sideboard:" {
                writing = false;
                continue;
            }
            let mut parts = line.split(" ").collect::<VecDeque<&str>>();
            let amount = match match parts.pop_front() {
                Some(str) => str,
                _ => return None,
            }
            .parse::<u16>()
            {
                Ok(amount) => amount,
                _ => return None,
            };
            let name: String = parts
                .into_iter()
                .collect::<Vec<&str>>()
                .join(" ")
                .to_string();
            let entry = (amount, name);
            if writing {
                main.push(entry)
            } else {
                sideboard.push(entry)
            }
        }
        Some(Self { main, sideboard })
    }

    pub fn parse_arena<S: ToString>(data: S) -> Option<Self> {
        let mut main = vec![];
        let mut sideboard = vec![];
        let mut writing = true;
        for line in data.to_string().lines() {
            if line.is_empty() {
                writing = false;
                continue;
            }
            let mut parts = line.split(" ").collect::<VecDeque<&str>>();
            let amount = match match parts.pop_front() {
                Some(str) => str,
                _ => return None,
            }
            .parse::<u16>()
            {
                Ok(amount) => amount,
                _ => return None,
            };
            let name: String = parts
                .into_iter()
                .collect::<Vec<&str>>()
                .join(" ")
                .to_string();
            let entry = (amount, name);
            if writing {
                main.push(entry)
            } else {
                sideboard.push(entry)
            }
        }
        Some(Self { main, sideboard })
    }
    pub fn parse_csv<S: ToString>(data: S) -> Option<Self> {
        let mut main = vec![];
        let mut sideboard = vec![];
        for result in csv::Reader::from_reader(data.to_string().as_bytes()).records() {
            let record = match result {
                Ok(record) => record,
                _ => return None,
            };
            if record.len() != 3 {
                return None;
            }
            if record.index(0) == "Count" {
                continue;
            }
            let amount = match record.index(0).parse::<u16>() {
                Ok(amount) => amount,
                _ => return None,
            };
            let name = record.index(1);
            let position = record.index(2);
            let entry = (amount, name.to_string());
            match position {
                "main" => main.push(entry),
                "sideboard" => sideboard.push(entry),
                _ => return None,
            }
        }
        Some(Self { main, sideboard })
    }
}