Browse Source

Handle csv parsing error to fix issue getzola/zola#588

index-subcmd
Matthew Ziter 5 years ago
parent
commit
844be88472
2 changed files with 40 additions and 3 deletions
  1. +36
    -3
      components/templates/src/global_fns/load_data.rs
  2. +4
    -0
      components/utils/test-files/uneven_rows.csv

+ 36
- 3
components/templates/src/global_fns/load_data.rs View File

@@ -183,7 +183,7 @@ impl LoadData {
pub fn new(content_path: PathBuf, base_path: PathBuf) -> Self { pub fn new(content_path: PathBuf, base_path: PathBuf) -> Self {
let client = Arc::new(Mutex::new(Client::builder().build().expect("reqwest client build"))); let client = Arc::new(Mutex::new(Client::builder().build().expect("reqwest client build")));
let result_cache = Arc::new(Mutex::new(HashMap::new())); let result_cache = Arc::new(Mutex::new(HashMap::new()));
Self {content_path, base_path, client, result_cache}
Self { content_path, base_path, client, result_cache }
} }
} }


@@ -291,7 +291,16 @@ fn load_csv(csv_data: String) -> Result<Value> {
let mut records_array: Vec<Value> = Vec::new(); let mut records_array: Vec<Value> = Vec::new();


for result in records { for result in records {
let record = result.unwrap();
let record = match result {
Ok(r) => r,
Err(e) => {
return Err(tera::Error::chain(
String::from("Error encountered when parsing csv records"),
e,
));
}
};

let mut elements_array: Vec<Value> = Vec::new(); let mut elements_array: Vec<Value> = Vec::new();


for e in record.into_iter() { for e in record.into_iter() {
@@ -310,7 +319,7 @@ fn load_csv(csv_data: String) -> Result<Value> {


#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use super::{LoadData, DataSource, OutputFormat};
use super::{DataSource, LoadData, OutputFormat};


use std::collections::HashMap; use std::collections::HashMap;
use std::path::PathBuf; use std::path::PathBuf;
@@ -455,6 +464,30 @@ mod tests {
) )
} }


// Test points to bad csv file with uneven row lengths
#[test]
fn bad_csv_should_result_in_error() {
let static_fn = LoadData::new(
PathBuf::from("../utils/test-files"),
PathBuf::from("../utils/test-files"),
);
let mut args = HashMap::new();
args.insert("path".to_string(), to_value("uneven_rows.csv").unwrap());
let result = static_fn.call(&args.clone());

assert!(result.is_err());

let error_kind = result.err().unwrap().kind;
match error_kind {
tera::ErrorKind::Msg(msg) => {
if msg != String::from("Error encountered when parsing csv records") {
panic!("Error message is wrong. Perhaps wrong error is being returned?");
}
}
_ => panic!("Error encountered was not expected CSV error"),
}
}

#[test] #[test]
fn can_load_json() { fn can_load_json() {
let static_fn = LoadData::new( let static_fn = LoadData::new(


+ 4
- 0
components/utils/test-files/uneven_rows.csv View File

@@ -0,0 +1,4 @@
Number,Title
1,Gutenberg
2,Printing
3,Typewriter,ExtraBadColumn

Loading…
Cancel
Save