simple_config 0.134.0

A config language for humans that is not self-describing.
Documentation
#[derive(Debug,PartialEq,serde::Deserialize)]
struct GitlabCi {
	variables: std::collections::BTreeMap<String, String>,
	cache: Cache,

	// #[serde(flatten)] serde_derive's flatten only supports self-describing formats :(
	jobs: std::collections::BTreeMap<String, Job>,
}

#[derive(Debug,PartialEq,serde::Deserialize)]
struct Cache {
	key: String,
	paths: Vec<String>,
}

#[derive(Debug,PartialEq,serde::Deserialize)]
struct Rule {
	r#if: Option<String>,
	when: String,
}

#[derive(Debug,PartialEq,serde::Deserialize)]
struct Job {
	#[serde(default)]
	only: Vec<String>,
	#[serde(default)]
	except: Vec<String>,

	#[serde(default)]
	rules: Vec<Rule>,

	stage: String,
	image: String,

	#[serde(default)]
	variables: std::collections::BTreeMap<String, String>,

	script: Vec<String>,
}

fn path_to(f: &str) -> String {
	format!("{}/examples/gitlab-ci/{}", env!("CARGO_MANIFEST_DIR"), f)
}

#[test]
fn test() {
	let scfg: GitlabCi = simple_config::from_file(path_to("gitlab-ci.scfg")).unwrap();

	let f = std::fs::File::open(path_to("gitlab-ci.yml")).expect("opening yaml");
	let mut yaml: GitlabCi = serde_yaml::from_reader(f).unwrap();

	// YAML puts a newline at the end of multi-line strings. Simple Config doesn't.
	for (_, job) in &mut yaml.jobs {
		for cmd in &mut job.script {
			cmd.truncate(cmd.trim_end_matches('\n').len())
		}
	}

	eprintln!("{:#?}", scfg);
	eprintln!("{:#?}", yaml);

	assert_eq!(scfg, yaml);
}