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
use std::fs::File;
use std::path::Path;
use std::path::PathBuf;
use csv::{Reader, ReaderBuilder};
use chord_core::input::{async_trait, CaseLoad, CaseStore, Error};
use chord_core::value::{Map, Value};
pub struct Store {
path: PathBuf,
}
impl Store {
pub async fn new<P: AsRef<Path>>(path: P) -> Result<Store, Error> {
Ok(Store {
path: path.as_ref().to_path_buf(),
})
}
}
#[async_trait]
impl CaseStore for Store {
async fn create(&self, name: &str) -> Result<Box<dyn CaseLoad>, Error> {
let loader = Loader::new(self.path.join(format!("{}.csv", name))).await?;
Ok(Box::new(loader))
}
}
struct Loader {
row_num: usize,
reader: Reader<File>,
}
impl Loader {
async fn new<P: AsRef<Path>>(path: P) -> Result<Loader, Error> {
let loader = Loader {
row_num: 1,
reader: from_path(path.as_ref()).await?,
};
Ok(loader)
}
}
#[async_trait]
impl CaseLoad for Loader {
async fn load(&mut self, size: usize) -> Result<Vec<(String, Value)>, Error> {
let dv = load(&mut self.reader, size).await?;
let mut result: Vec<(String, Value)> = vec![];
for d in dv {
self.row_num = self.row_num + 1;
result.push((self.row_num.to_string(), d));
}
Ok(result)
}
}
async fn load<R: std::io::Read>(reader: &mut Reader<R>, size: usize) -> Result<Vec<Value>, Error> {
let mut hashmap_vec = Vec::new();
let mut curr_size = 0;
for result in reader.deserialize() {
let result: Map = result?;
let mut record: Map = Map::new();
for (k, v) in result {
if v.is_string() {
record.insert(k, v);
} else {
record.insert(k, Value::String(v.to_string()));
}
}
hashmap_vec.push(Value::Object(record));
curr_size += 1;
if curr_size == size {
break;
}
}
Ok(hashmap_vec)
}
async fn from_path<P: AsRef<Path>>(path: P) -> Result<Reader<File>, Error> {
Ok(ReaderBuilder::new().from_path(path)?)
}