view examples/word-analyze/src/main.rs @ 641:2db2252aaa84 default tip master

More clippy refactoring
author Lewin Bormann <lbo@spheniscida.de>
date Sat, 15 Jun 2024 17:48:32 +0200
parents 68887f0a3e83
children
line wrap: on
line source

use leveldb::CompressorId;
use rusty_leveldb as leveldb;

use std::fs::OpenOptions;
use std::io::{self, BufRead};
use std::path::Path;

fn update_count(w: &str, db: &mut leveldb::DB) -> Option<()> {
    let mut count: usize = 0;
    if let Some(v) = db.get(w.as_bytes()) {
        let s = String::from_utf8(v).unwrap();
        count = s.parse::<usize>().unwrap();
    }
    count += 1;
    let s = count.to_string();
    db.put(w.as_bytes(), s.as_bytes()).unwrap();
    Some(())
}

fn run(mut db: leveldb::DB) -> io::Result<()> {
    let files = std::env::args().skip(1);

    for f in files {
        let f = OpenOptions::new().read(true).open(Path::new(&f))?;
        for line in io::BufReader::new(f).lines() {
            for word in line.unwrap().split_whitespace() {
                let mut word = word.to_ascii_lowercase();
                word.retain(|c| c.is_ascii_alphanumeric());
                update_count(&word, &mut db);
            }
        }
    }

    Ok(())
}

fn main() {
    let opts = leveldb::Options {
        compressor: leveldb::compressor::NoneCompressor::ID,
        ..Default::default()
    };
    let db = leveldb::DB::open("wordsdb", opts).unwrap();

    run(db).unwrap();
}