#[tokio::main]
async fn main() -> std::process::ExitCode {
mesofact_dev::cli::run().await
}
#[cfg(test)]
mod tests {
use std::collections::{BTreeMap, BTreeSet};
type Features = BTreeMap<String, Vec<String>>;
fn features_of(manifest: &str) -> Features {
let doc: toml::Value = toml::from_str(manifest).expect("manifest parses");
let Some(table) = doc.get("features").and_then(|f| f.as_table()) else {
return Features::new();
};
table
.iter()
.map(|(k, v)| {
let entries = v
.as_array()
.expect("a feature's value is an array")
.iter()
.map(|e| e.as_str().expect("a feature entry is a string").to_string())
.collect();
(k.clone(), entries)
})
.collect()
}
#[test]
fn every_mesofact_dev_feature_is_forwarded() {
let here = std::path::Path::new(env!("CARGO_MANIFEST_DIR"));
let dev_manifest = here.join("../mesofact-dev/Cargo.toml");
let Ok(dev_text) = std::fs::read_to_string(&dev_manifest) else {
return;
};
let dev = features_of(&dev_text);
let mes = features_of(&std::fs::read_to_string(here.join("Cargo.toml")).unwrap());
assert_eq!(
dev.keys().collect::<BTreeSet<_>>(),
mes.keys().collect::<BTreeSet<_>>(),
"mes must declare exactly the features mesofact-dev does — a feature \
present in only one of the two is either unreachable or a no-op"
);
assert_eq!(
dev["default"], mes["default"],
"the default feature set must match, or `cargo install mes` and \
`cargo build -p mesofact-dev` link different things"
);
for (name, dev_entries) in dev.iter().filter(|(k, _)| k.as_str() != "default") {
let forwarded = format!("mesofact-dev/{name}");
assert!(
mes[name].contains(&forwarded),
"mes's `{name}` does not enable `{forwarded}`, so passing it does nothing"
);
for implied in dev_entries.iter().filter(|e| dev.contains_key(*e)) {
assert!(
mes[name].contains(implied),
"mesofact-dev's `{name}` implies `{implied}`; mes's `{name}` must too"
);
}
}
}
}