ganganonline-parser-lib 0.0.0

ganganonline parser for rust using pb-rs
Documentation
extern crate pb_rs;
use pb_rs::types::{
	Config,
	FileDescriptor,
};
use std::{
	fs::OpenOptions,
	io::{
		BufRead,
		BufReader,
		Write,
	},
	path::PathBuf,
};
macro_rules! manifest_dir {
	() => {
		::std::env::var("CARGO_MANIFEST_DIR")
			.expect("CARGO_MANIFEST_DIR is not set")
	};
}
macro_rules! out_dir {
	() => {
		::std::env::var("OUT_DIR").expect("OUT_DIR is not set")
	};
}
const READER: &str = "/reader.rs";
fn main() {
	println!("{:?}", manifest_dir!());
	let in_file: PathBuf = (manifest_dir!() + "/src/reader.proto").into();
	let out_file: PathBuf = (out_dir!() + READER).into();
	println!("in_file: {:?}, out_file: {:?}", in_file, out_file);
	let cfg = Config {
		in_file,
		out_file,
		single_module: false,
		import_search_path: vec![],
		no_output: false,
		error_cycle: true,
		headers: false,
		dont_use_cow: cfg!(feature = "no_cow"),
		custom_includes: if cfg!(feature = "serde") {
			vec!["use serde::{Serialize, Deserialize};".to_owned()]
		} else {
			vec![]
		},
		custom_struct_derive: if cfg!(feature = "serde") {
			vec!["Serialize, Deserialize".to_owned()]
		} else {
			vec![]
		},
		custom_rpc_generator: Box::new(|_, _| Ok(())),
		owned: false,
	};

	FileDescriptor::write_proto(&cfg).expect("written protobuf");
	if cfg!(feature = "serde") {
		let out_file = PathBuf::from(out_dir!() + READER);
		println!("{:?}", out_file);
		let file = OpenOptions::new()
			.read(true)
			.open(&out_file)
			.expect("a file out");
		let lines = BufReader::new(file)
			.lines()
			.map(|s| s.expect("line"))
			.collect::<Vec<String>>();
		let mut file_out = OpenOptions::new()
			.write(true)
			.truncate(true)
			.open(&out_file)
			.expect("a writable file");
		for line in lines.into_iter() {
			const SUPER: &'static str = "\nuse super::*;";
			const DERIVE: &'static str = "\n#[derive(Serialize, Deserialize)]";
			let new_line = match line.as_str() {
				"#[derive(Debug, PartialEq, Clone)]" => line + DERIVE,
				"#[derive(Debug, PartialEq, Eq, Clone, Copy)]" => {
					SUPER.to_owned() + &line + DERIVE
				}
				s => s.into(),
			};
			writeln!(file_out, "{}", new_line,).expect("to write a line");
		}
	}
}