foch 0.1.0

Paradox mod static analysis toolkit with CLI and EU4-focused language tooling
Documentation
use crate::domain::ParseError;
use jomini::JominiDeserialize;
use std::path::Path;

#[derive(JominiDeserialize, Debug, Clone, Default)]
pub struct ModDescriptor {
	#[jomini(default)]
	pub name: String,
	pub path: Option<String>,
	#[jomini(default)]
	pub tags: Vec<String>,
	#[jomini(default)]
	pub dependencies: Vec<String>,
	pub version: Option<String>,
	pub remote_file_id: Option<String>,
	pub supported_version: Option<String>,
}

pub fn load_descriptor(path: &Path) -> Result<ModDescriptor, ParseError> {
	let data = std::fs::read(path).map_err(|err| ParseError::io(path.to_path_buf(), err))?;
	jomini::text::de::from_windows1252_slice::<ModDescriptor>(&data)
		.map_err(|err| ParseError::format(path.to_path_buf(), err.to_string()))
}

#[cfg(test)]
mod tests {
	use super::load_descriptor;
	use std::path::Path;

	#[test]
	fn parses_descriptor_from_corpus() {
		let manifest_dir = Path::new(env!("CARGO_MANIFEST_DIR"));
		let test_file = manifest_dir
			.join("tests")
			.join("corpus")
			.join("defines")
			.join("descriptor.mod");

		let descriptor = load_descriptor(&test_file).expect("failed to parse descriptor");
		assert_eq!(descriptor.name, "defines");
		assert_eq!(descriptor.version.as_deref(), Some("0.0.1"));
		assert_eq!(descriptor.remote_file_id.as_deref(), Some("2887527268"));
	}
}