aboutsummaryrefslogtreecommitdiff
path: root/src/main.rs
blob: e6d997d3efc5b388f97c73578a0abef565f09f75 (plain)
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
mod consts;
mod utils;
mod lex;

use consts::SRC;
use lex::{Stanza, StanzaLexError};
use utils::FromStaticStr;

fn main() {
    let mut count = 0;
    let mut parse_state = ParseState::Ready;
    let mut current_entry = EntryBuilder::new();
    let mut dict = Dictionary {
        entries: vec![],
    };

    for l in SRC.split("\n\n") {
        count += 1;
        let stanza = match Stanza::from_str(l) {
            Ok(s) => {
                println!("{count} ok");
                s
            },
            Err(StanzaLexError { data }) => {
                eprintln!("stanza err: {data}\n\n");
                continue;
            },
        };
        match stanza {
            Stanza::Entry(s) if parse_state == ParseState::Ready => {
                current_entry.set_name(s);
                parse_state = ParseState::InEntry;
            }
            Stanza::Defn(d) if parse_state == ParseState::InEntry => {
                current_entry.set_defn(d);

                match current_entry.build() {
                    Ok(e) => dict.entries.push(e),
                    Err(_) => eprintln!("failed to build entry"),
                }

                parse_state = ParseState::Ready;
            }
            _ => ()
        }
    }
    dbg!(dict.entries.iter().find(|entry| entry.name.to_ascii_lowercase().starts_with("discursive")));
}

#[derive(PartialEq, Eq, PartialOrd, Ord)]
enum ParseState {
    Ready,
    InEntry
}

struct Dictionary {
    entries: Vec<Entry>
}

#[derive(Debug)]
struct Entry {
    name: &'static str,
    defn: Option<&'static str>,
    note: Option<&'static str>,
    synonym: Option<&'static str>,
}

#[derive(Default)]
struct EntryBuilder {
    name: Option<&'static str>,
    defn: Option<&'static str>,
    note: Option<&'static str>,
    synonym: Option<&'static str>,
}

enum EntryBuilderError {
    MissingField(&'static str)
}

impl EntryBuilder {
    fn new() -> Self {
        Self::default()
    }

    fn set_name(&mut self, name: &'static str) {
        self.name = Some(name);
    }

    fn set_defn(&mut self, defn: &'static str) {
        self.defn = Some(defn);
    }

    fn build(&self) -> Result<Entry, EntryBuilderError> {
        Ok(Entry {
            name: self.name.ok_or(EntryBuilderError::MissingField("name"))?,
            defn: self.defn,
            note: self.note,
            synonym: self.synonym,
        }) 
    }
}