1 use std::env; 2 use std::error::Error; 3 use std::io; 4 use std::process; 5 run() -> Result<(), Box<dyn Error>>6fn run() -> Result<(), Box<dyn Error>> { 7 let query = match env::args().nth(1) { 8 None => return Err(From::from("expected 1 argument, but got none")), 9 Some(query) => query, 10 }; 11 12 let mut rdr = csv::Reader::from_reader(io::stdin()); 13 let mut wtr = csv::Writer::from_writer(io::stdout()); 14 15 wtr.write_record(rdr.byte_headers()?)?; 16 17 for result in rdr.byte_records() { 18 let record = result?; 19 // `query` is a `String` while `field` is now a `&[u8]`, so we'll 20 // need to convert `query` to `&[u8]` before doing a comparison. 21 if record.iter().any(|field| field == query.as_bytes()) { 22 wtr.write_record(&record)?; 23 } 24 } 25 26 wtr.flush()?; 27 Ok(()) 28 } 29 main()30fn main() { 31 if let Err(err) = run() { 32 println!("{}", err); 33 process::exit(1); 34 } 35 } 36