Skip to content

Commit

Permalink
Inferring headers
Browse files Browse the repository at this point in the history
  • Loading branch information
Yomguithereal committed Jan 27, 2021
1 parent 45d66bb commit f3cfdd4
Showing 1 changed file with 47 additions and 3 deletions.
50 changes: 47 additions & 3 deletions src/cmd/jsonl.rs
Original file line number Diff line number Diff line change
Expand Up @@ -32,25 +32,69 @@ struct Args {
flag_output: Option<String>,
}

fn infer_headers(value: Value) -> Option<Vec<String>> {
let mut headers: Vec<String> = Vec::new();
fn recurse_to_infer_headers(value: Value, headers: &mut Vec<Vec<String>>, path: Vec<String>) {
match value {
Value::Object(map) => {
for (key, value) in map.iter() {

match value {
Value::Null |
Value::Bool(_) |
Value::Number(_) |
Value::String(_) => {
let mut full_path = path.clone();
full_path.push(key.to_string());

headers.push(full_path);
},
Value::Object(_) => {
let mut new_path = path.clone();
new_path.push(key.to_string());

recurse_to_infer_headers(value.to_owned(), headers, new_path);
}
_ => {}
}
}
},
_ => {
headers.push(vec![String::from("value")]);
}
}
}

fn infer_headers(value: Value) -> Option<Vec<Vec<String>>> {
let mut headers: Vec<Vec<String>> = Vec::new();

recurse_to_infer_headers(value, &mut headers, Vec::new());

return Some(headers);
}

pub fn run(argv: &[&str]) -> CliResult<()> {
let args: Args = util::get_args(USAGE, argv)?;
let mut wtr = Config::new(&args.flag_output).writer()?;

let rdr: Box<dyn BufRead> = match args.arg_input {
None => Box::new(BufReader::new(io::stdin())),
Some(p) => Box::new(BufReader::new(fs::File::open(p)?))
};

let mut headers_emitted: bool = false;

for line in rdr.lines() {
let value: Value = serde_json::from_str(&line?)
.expect("Could not parse line as JSON!");

println!("{:?}", value);
if !headers_emitted {
if let Some(headers) = infer_headers(value) {
let headers = headers.iter().map(|v| v.join(".")).collect::<Vec<String>>();
let headers = csv::StringRecord::from(headers);
wtr.write_record(&headers)?;
}

headers_emitted = true;
}
}

Ok(())
Expand Down

0 comments on commit f3cfdd4

Please sign in to comment.