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,
})
}
}
|