csvll/
lib.rs

1mod file_help;
2mod side_models;
3
4use side_models::{Word, Language};
5use std::fs::File;
6use std::error::Error;
7
8pub struct Manager {
9    pub file: File,
10    pub langs: Vec<Language>,
11    pub words: Vec<Word>,
12    pub def_lang: i32
13} impl Manager {
14    pub fn new(direc: &str, name: &str) -> Manager {
15        Manager {
16            file: file_help::open(
17                direc.to_string(),
18                name.to_string(),
19                "csv".to_string()
20            ),
21            langs: Vec::new(),
22            words: Vec::new(),
23            // Default lang is 0 (0 => none)
24            def_lang: 0
25        }
26    }
27
28    pub fn parse(&mut self) {
29        let mut content = file_help::read(&mut self.file);
30        let lines: Vec<&str> = content.split("\n").collect();
31
32        let first_row: Vec<&str> = lines.first().unwrap().split(",").collect();
33
34        // NOTE: Care about performance for parsing words
35        // Old method:
36        // Going through all rows and getting the value at position of current language
37        // New method:
38        // Going through the rows, then languages
39
40        //Problem with IDs
41        // NOTE: ID for word is current loop position, not actual ID from table
42        for current_row in 1..lines.len() {
43            let row_vec: Vec<&str> = lines[current_row].split(",").collect();
44            let word_index: i32 = match row_vec.first().unwrap().trim().parse() {
45                Ok(i) => i,
46                Err(why) => panic!("Not an index for words in row {}. Error: {}", current_row, why.description())
47            };
48            for lang_id in 1..first_row.len() {
49                match row_vec.get(lang_id) {
50                    Some(val) => { self.words.push(Word::new(word_index, lang_id as i32 - 1, val));
51                                    // println!("{}", val)
52                                 },
53                    None => println!("Hey")
54                }
55            }
56        }
57
58        // Language parsing
59        for lang_i in 1..first_row.len() {
60            self.langs.push(Language::new(lang_i as i32 - 1, first_row[lang_i]));
61        }
62    }
63
64    // Change default language for manager / app
65    pub fn set_def(&mut self, lang_id: i32) {
66        self.def_lang = lang_id + 1
67    }
68
69    pub fn get_def(&self) -> (&Language, Vec<&Word>) {
70        // TODO: Try to make it work without temporary vec
71        let mut word_vec: Vec<&Word> = Vec::new();
72        for word in &self.words {
73            if word.lang_id == (self.def_lang - 1) {
74                word_vec.push(word)
75            }
76        }
77
78        if self.def_lang != 0 {
79            // NOTE: def_lang - 1, because we store at default setting + 1
80            if let Some(lang) = self.langs.get((self.def_lang - 1) as usize) {
81                // TODO: Return right word vec
82                return (lang, word_vec)
83            }  else {
84                panic!("Couldn't find set default language")
85            }
86        } else {
87            panic!("No default language set!");
88        }
89    }
90
91    // Return word reference of current def. lang. at index
92    pub fn get_word(&self, word_id: i32) -> &Word {
93        for word in &self.words {
94                if word.lang_id == self.def_lang - 1 && word.id == word_id {
95                    return word
96                }
97        }
98        panic!("Couldn't find a word with id {} at set def. lang. {}", word_id, self.def_lang);
99    }
100
101}