extern crate proc_macro; use proc_macro::TokenStream; use std::{collections::HashMap, fs::File, io::BufReader}; use std::io::prelude::*; fn readds100() -> HashMap { // who needs obvious filepaths, anyways? let filename = "./DBNetz-Betriebsstellenverzeichnis-Stand2021-10.csv"; let file = File::open(filename).unwrap(); let reader = BufReader::new(file); reader.lines() .filter_map(|l| l.ok()) .skip(1) .map(|l| { let segments: Vec<&str> = l .split(";") .collect(); (segments[1].to_owned(),segments[2].to_owned()) }) .collect::>() } // rust macros are a strange kind of horrible, tbh #[proc_macro] pub fn make_ds100(_item: TokenStream) -> TokenStream { let symbols = readds100(); format!( "pub fn ds100(key: &str) -> Option<&str> {{ match key {{ {} _ => None }} }}", symbols.iter() .map(|(k,v)| format!("\"{}\" => Some(\"{}\"),",k,v)) .collect::>() .join("\n") ).parse().unwrap() }