diff options
author | Teddy Wing | 2022-03-12 21:56:23 +0100 |
---|---|---|
committer | Teddy Wing | 2022-03-12 21:56:23 +0100 |
commit | 2388395752fbd56b8e1213ff60ccb2a40d23c806 (patch) | |
tree | 2fee0b8590728376e941e9b5969513919f2d699e /src/yaml.rs | |
parent | f4d5d7ee9897ed59cf83313774d160c832c091f3 (diff) | |
download | yaqlite-2388395752fbd56b8e1213ff60ccb2a40d23c806.tar.bz2 |
Move `yaml_extract()` to `yaqlite::yaml::extract()`
Diffstat (limited to 'src/yaml.rs')
-rw-r--r-- | src/yaml.rs | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/src/yaml.rs b/src/yaml.rs index 2da8dc3..532658a 100644 --- a/src/yaml.rs +++ b/src/yaml.rs @@ -1,3 +1,58 @@ +use rusqlite; +use yaml_rust::yaml; + +use std::collections::HashMap; + + mod sql; pub use sql::*; + + +pub fn extract( + doc: &mut yaml::Yaml, + tx: &rusqlite::Transaction, + table_columns: &HashMap<String, crate::sqlite::Zero>, +) { + match doc { + yaml::Yaml::Array(ref mut array) => { + for yaml_value in array { + extract(yaml_value, tx, table_columns); + } + } + yaml::Yaml::Hash(ref mut hash) => { + let keys: Vec<yaml::Yaml> = hash.keys().map(|k| k.clone()).collect(); + let columns_as_yaml: Vec<yaml::Yaml> = table_columns.keys() + .map(|c| yaml::Yaml::from_str(c)) + .collect(); + + for key in keys.iter() { + if !columns_as_yaml.contains(key) { + hash.remove(key); + } + } + + let mut stmt = tx.prepare( + &format!( + r#" + INSERT INTO "people" + ({}) + VALUES + ({}); + "#, + // Wrap column names in quotes. + hash.keys() + .map(|k| format!(r#""{}""#, k.as_str().unwrap())) + .collect::<Vec<String>>() + .join(", "), + // TODO: get len "?"s + format!("{}?", "?, ".repeat(hash.len() - 1)), + ) + ).unwrap(); + + let values = hash.values().map(|v| Yaml(v)); + stmt.insert(rusqlite::params_from_iter(values)).unwrap(); + } + _ => {} + } +} |