use crate::VergenKey;
use anyhow::{Error, Result};
use std::collections::BTreeMap;
pub type CargoRustcEnvMap = BTreeMap<VergenKey, String>;
pub type CargoRerunIfChanged = Vec<String>;
pub type CargoWarning = Vec<String>;
#[derive(Debug)]
pub struct DefaultConfig {
fail_on_error: bool,
error: Error,
}
impl DefaultConfig {
#[must_use]
pub fn new(fail_on_error: bool, error: Error) -> Self {
Self {
fail_on_error,
error,
}
}
#[must_use]
pub fn fail_on_error(&self) -> &bool {
&self.fail_on_error
}
#[must_use]
pub fn error(&self) -> &Error {
&self.error
}
}
pub trait Add {
fn add_map_entries(
&self,
idempotent: bool,
cargo_rustc_env: &mut CargoRustcEnvMap,
cargo_rerun_if_changed: &mut CargoRerunIfChanged,
cargo_warning: &mut CargoWarning,
) -> Result<()>;
fn add_default_entries(
&self,
config: &DefaultConfig,
cargo_rustc_env_map: &mut CargoRustcEnvMap,
cargo_rerun_if_changed: &mut CargoRerunIfChanged,
cargo_warning: &mut CargoWarning,
) -> Result<()>;
}
pub trait AddCustom<K: Into<String> + Ord, V: Into<String>> {
fn add_calculated_entries(
&self,
idempotent: bool,
cargo_rustc_env_map: &mut BTreeMap<K, V>,
cargo_rerun_if_changed: &mut CargoRerunIfChanged,
cargo_warning: &mut CargoWarning,
) -> Result<()>;
fn add_default_entries(
&self,
config: &DefaultConfig,
cargo_rustc_env_map: &mut BTreeMap<K, V>,
cargo_rerun_if_changed: &mut CargoRerunIfChanged,
cargo_warning: &mut CargoWarning,
) -> Result<()>;
}
#[doc(hidden)]
pub(crate) mod test_gen {
use crate::{AddCustomEntries, CargoRerunIfChanged, CargoWarning};
use anyhow::{Result, anyhow};
use derive_builder::Builder;
use std::collections::BTreeMap;
#[doc(hidden)]
#[derive(Builder, Clone, Copy, Debug, Default)]
pub struct CustomInsGen {
fail: bool,
}
impl AddCustomEntries<&str, &str> for CustomInsGen {
fn add_calculated_entries(
&self,
idempotent: bool,
cargo_rustc_env_map: &mut BTreeMap<&str, &str>,
_cargo_rerun_if_changed: &mut CargoRerunIfChanged,
_cargo_warning: &mut CargoWarning,
) -> Result<()> {
if self.fail {
Err(anyhow!("We have failed"))
} else {
if idempotent {
let _ = cargo_rustc_env_map.insert("test", "VERGEN_IDEMPOTENT_OUTPUT");
} else {
let _ = cargo_rustc_env_map.insert("test", "value");
}
Ok(())
}
}
fn add_default_entries(
&self,
config: &crate::DefaultConfig,
cargo_rustc_env_map: &mut BTreeMap<&str, &str>,
_cargo_rerun_if_changed: &mut CargoRerunIfChanged,
_cargo_warning: &mut CargoWarning,
) -> Result<()> {
if *config.fail_on_error() {
let error = anyhow!(format!("{}", config.error()));
Err(error)
} else {
let _ = cargo_rustc_env_map.insert("test", "VERGEN_IDEMPOTENT_OUTPUT");
Ok(())
}
}
}
}
#[cfg(test)]
mod test {
use super::DefaultConfig;
use anyhow::{Result, anyhow};
use std::io::Write;
#[test]
fn default_config_debug() -> Result<()> {
let config = DefaultConfig::new(true, anyhow!("blah"));
let mut buf = vec![];
write!(buf, "{config:?}")?;
assert!(!buf.is_empty());
Ok(())
}
}