aboutsummaryrefslogtreecommitdiffhomepage
path: root/build.rs
diff options
context:
space:
mode:
Diffstat (limited to 'build.rs')
-rw-r--r--build.rs46
1 files changed, 46 insertions, 0 deletions
diff --git a/build.rs b/build.rs
new file mode 100644
index 0000000..dcf1cc3
--- /dev/null
+++ b/build.rs
@@ -0,0 +1,46 @@
+use std::fs::File;
+use std::io::{BufRead, BufReader, BufWriter, Result, Write};
+use std::path::Path;
+
+const NUM_LETTERS: usize = 26;
+
+fn main() -> Result<()> {
+ let chars = {
+ let file = File::open("/usr/share/dict/words")?;
+ let reader = BufReader::new(file);
+ parse(reader)?
+ };
+
+ let out_path = Path::new(&std::env::var("OUT_DIR").unwrap()).join("prebuilt_model.rs");
+ let file = File::create(out_path)?;
+ let mut writer = BufWriter::new(file);
+ writeln!(writer, "[")?;
+ for i in 0..(NUM_LETTERS + 1) {
+ write!(writer, "[")?;
+ for j in 0..(NUM_LETTERS + 1) {
+ write!(writer, "{},", chars[i][j])?;
+ }
+ writeln!(writer, "],")?;
+ }
+ writeln!(writer, "]")?;
+
+ Ok(())
+}
+
+fn parse(r: BufReader<File>) -> Result<[[usize; NUM_LETTERS + 1]; NUM_LETTERS + 1]> {
+ let mut chars = [[0; NUM_LETTERS + 1]; NUM_LETTERS + 1];
+ for line in r.lines() {
+ let word = line?;
+ let mut prefix = NUM_LETTERS;
+ for c in word.bytes() {
+ let c = c.to_ascii_lowercase();
+ if !c.is_ascii_lowercase() {
+ continue;
+ }
+ let i = (c - b'a') as usize;
+ chars[prefix][i] += 1;
+ prefix = i;
+ }
+ }
+ Ok(chars)
+}