use std::path::PathBuf;
use hashbrown::HashSet;
#[derive(Debug)]
#[non_exhaustive]
pub struct Status {
pub prjname: String,
pub local_root: PathBuf,
pub checkout_hash: String,
pub checkout_ts: String,
pub tags: HashSet<String>,
pub uncommitted: bool,
pub untracked: bool,
pub tagged: Option<String>
}
#[derive(Default)]
pub struct Builder {
lenient_clean: bool,
#[allow(clippy::type_complexity)]
match_tag: Option<Box<dyn Fn(&str) -> bool>>
}
impl Builder {
#[must_use]
pub const fn lenient_clean(mut self) -> Self {
self.lenient_clean = true;
self
}
#[must_use]
pub fn detect_tagged<F>(mut self, f: F) -> Self
where
F: Fn(&str) -> bool + 'static
{
self.match_tag = Some(Box::new(f));
self
}
#[must_use]
pub fn build(self) -> Status {
let st = fslutils::status(None).unwrap();
println!(
"cargo::rustc-check-cfg=cfg(fsl_checkout, values(\"dirty\", \"clean\"))"
);
println!("cargo::rustc-check-cfg=cfg(fsl_tagged)");
make_env_var("prjname", &st.prjname);
make_env_var("prjcode", &st.prjcode);
make_env_var("checkout-hash", &st.checkout_hash);
make_env_var("checkout-ts", &st.checkout_ts);
let checkout_state = if self.lenient_clean {
if st.uncommitted { "dirty" } else { "clean" }
} else if st.uncommitted || st.untracked {
"dirty"
} else {
"clean"
};
make_env_var("checkout", checkout_state);
make_cfg_var("checkout", Some(checkout_state));
let mut tagged = None;
if let Some(match_tag) = self.match_tag {
for tag in &st.tags {
if match_tag(tag) {
make_env_var("tagged", tag);
make_cfg_var("tagged", None);
tagged = Some(tag.clone());
break;
}
}
}
Status {
prjname: st.prjname,
local_root: st.local_root,
checkout_hash: st.checkout_hash,
checkout_ts: st.checkout_ts,
tags: st.tags,
uncommitted: st.uncommitted,
untracked: st.untracked,
tagged
}
}
}
fn make_env_var(key: &str, val: &str) {
let key = key.replace('-', "_").to_uppercase();
println!("cargo:rustc-env=FSL_{key}={val}");
}
fn make_cfg_var(key: &str, val: Option<&str>) {
let lkey = key.replace('-', "_").to_lowercase();
if let Some(val) = val {
println!(r#"cargo:rustc-cfg=fsl_{lkey}="{val}""#);
} else {
println!(r"cargo:rustc-cfg=fsl_{lkey}");
}
}