| 161 | } |
| 162 | |
| 163 | fn write(&self, values: Vec<serde_json::Value>) -> Result<(), Error> { |
| 164 | let mut writer = csv::Writer::from_writer(std::io::stdout()); |
| 165 | |
| 166 | let obj = values[0].as_object().ok_or_else(|| EachError::Data { |
| 167 | message: format!("Data to write must be an object, received: {:?}", values[0]), |
| 168 | })?; |
| 169 | |
| 170 | let header: Vec<&String> = obj.keys().collect(); |
| 171 | writer.serialize(&header)?; |
| 172 | |
| 173 | for value in &values { |
| 174 | let obj = match value.as_object() { |
| 175 | Some(obj) => obj, |
| 176 | None => unreachable!("The shape of each row must be the same as the header"), |
| 177 | }; |
| 178 | |
| 179 | let row: Result<Vec<String>, _> = header |
| 180 | .iter() |
| 181 | .map(|k| -> Result<String, _> { |
| 182 | let v = &obj[k.as_str()]; |
| 183 | match v.as_str() { |
| 184 | Some(s) => Ok(s.to_owned()), |
| 185 | None => serde_json::to_string(v), |
| 186 | } |
| 187 | }) |
| 188 | .collect(); |
| 189 | writer.serialize(row?)?; |
| 190 | } |
| 191 | |
| 192 | writer.flush()?; |
| 193 | Ok(()) |
| 194 | } |
| 195 | } |