Rust data structure.
This is my implementation to get headers preserving order:
use serde::{Deserialize, Serialize};
use csv::{Reader, Writer, StringRecord};
#[derive(Default, Debug, Deserialize, Serialize)]
pub struct Colunas {
#[serde(rename = "Arquivo Teste")]
arquivo: String,
#[serde(rename = "CNPJ dos Estabelecimentos")]
cnpj: Option<String>,
#[serde(rename = "Ano do Período de Apuração")]
ano: Option<usize>,
#[serde(rename = "Mês")]
m: u32,
}
impl Colunas {
fn get_headers(self) -> StringRecord {
// https://docs.rs/csv/1.0.0/csv/struct.Writer.html
let mut wtr = Writer::from_writer(vec![]);
wtr.serialize( Colunas::default() ).ok();
let colunas = String::from_utf8(wtr.into_inner().ok().unwrap()).ok().unwrap();
// split-a-string-in-rust
let mut lines = colunas.lines();
let first_line = lines.next().unwrap();
//println!("first_line: {:#?}", &first_line);
let vec: Vec<&str> = first_line.split(',').collect();
//println!("vec: {:#?}", vec);
//https://docs.rs/csv/1.0.0-beta.2/csv/struct.StringRecord.html
// https://docs.rs/csv/1.0.0/csv/struct.Reader.html
let mut rdr = Reader::from_reader("".as_bytes());
rdr.set_headers(StringRecord::from(vec));
let headers = rdr.headers().ok().unwrap();
//println!("headers: {:#?}", headers);
headers.clone()
}
}
fn main() {
let headers = Colunas::default().get_headers();
println!("headers: {:#?}", headers);
}
Is there any other more elegant and concise way?
Rust playground: https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=24cd9eeed8f5fbfa2abf0eff467a03a2
The output is:
headers: StringRecord(["Arquivo Teste", "CNPJ dos Estabelecimentos", "Ano do Período de Apuração", "Mês"])