wt_csv 0.10.0

Custom CSV parser for the .csv files that the game War Thunder utilizes
Documentation
use crate::wtcsv::core::wtcsv::WTCSV;

#[derive(Debug)]
pub struct Diff {
	pub id: String,
	pub old: String,
	pub new: String,
}

#[allow(clippy::missing_errors_doc)]
impl Diff {
	pub fn from_wtcsv(left: &WTCSV, right: &WTCSV) -> Result<Vec<Self>, String> {
		left.is_compatible(right)?;

		let mut diffs: Vec<Self> =  Vec::new();

		for (i, record) in left.records.iter().enumerate() {
			for (j, item) in record.items.iter().enumerate() {
				if right.records[i].items[j] != *item {
					diffs.push(Diff {
						id: record.items[0].clone(),
						old: item.clone(),
						new: right.records[i].items[j].clone() ,
					});
					break;
				}
			}
		}

		Ok(diffs)
	}
}

#[cfg(test)]
mod tests {
	use std::fs;
	use crate::diff::Diff;
	use crate::wtcsv::core::wtcsv::WTCSV;

	#[test]
	fn expect_diff() {
		let init = fs::read_to_string("lang/_common_languages.csv").unwrap();
		let init = WTCSV::new_from_file(&init, "_common_languages").unwrap();

		let mut diff = init.clone();
		diff.edit_record_by_id("country_britain", "tea").unwrap();

		let diff_res = Diff::from_wtcsv(&init, &diff).unwrap();

		assert_eq!(r#"[Diff { id: "country_britain", old: "Great Britain", new: "tea" }]"#, format!("{:?}", diff_res));
	}
	#[test]
	fn expect_diff_invert() {
		let init = fs::read_to_string("lang/_common_languages.csv").unwrap();
		let init = WTCSV::new_from_file(&init, "_common_languages").unwrap();

		let mut diff = init.clone();
		diff.edit_record_by_id("country_britain", "tea").unwrap();

		let diff_res = Diff::from_wtcsv(&diff, &init).unwrap();

		assert_eq!(r#"[Diff { id: "country_britain", old: "tea", new: "Great Britain" }]"#, format!("{:?}", diff_res));
	}
}