| 127 | } |
| 128 | |
| 129 | fn parse(&self, input: &mut dyn Read) -> Result<serde_json::Value, Error> { |
| 130 | let mut reader = self.reader_builder().from_reader(input); |
| 131 | let mut it = reader.records(); |
| 132 | |
| 133 | let header_row = it.next().ok_or_else(|| EachError::Data { |
| 134 | message: "Header row is empty".to_string(), |
| 135 | })?; |
| 136 | |
| 137 | let header: Vec<String> = header_row?.iter().map(|s| s.into()).collect(); |
| 138 | |
| 139 | let mut values: Vec<serde_json::Value> = Vec::new(); |
| 140 | for (i, result) in it.enumerate() { |
| 141 | let cols = result?; |
| 142 | if cols.len() != header.len() { |
| 143 | return Err(EachError::Data { |
| 144 | message: format!( |
| 145 | "Row {} has different number of records than the header: {:?}", |
| 146 | i, &cols |
| 147 | ), |
| 148 | } |
| 149 | .into()); |
| 150 | } |
| 151 | |
| 152 | let mut map = serde_json::map::Map::new(); |
| 153 | for (j, col) in cols.iter().enumerate() { |
| 154 | map.insert(header[j].clone(), col.to_string().into()); |
| 155 | } |
| 156 | |
| 157 | values.push(map.into()); |
| 158 | } |
| 159 | |
| 160 | Ok(values.into()) |
| 161 | } |
| 162 | |
| 163 | fn write(&self, values: Vec<serde_json::Value>) -> Result<(), Error> { |
| 164 | let mut writer = csv::Writer::from_writer(std::io::stdout()); |