use serde::{Deserialize, Serialize};
use tatara_lisp_derive::TataraDomain as DeriveTataraDomain;
use crate::derivation::Derivation;
#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize, Default)]
pub enum OverlayTarget {
#[default]
PackageSet,
PerSystem,
Module,
}
#[derive(DeriveTataraDomain, Clone, Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
#[tatara(keyword = "defoverlay")]
pub struct Overlay {
pub name: String,
#[serde(default)]
pub target: OverlayTarget,
#[serde(default)]
pub adds: Vec<Derivation>,
#[serde(default)]
pub replaces: Vec<Replacement>,
#[serde(default)]
pub description: Option<String>,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Replacement {
pub upstream_name: String,
pub with: Derivation,
}
#[cfg(test)]
mod tests {
use super::*;
use tatara_lisp::{domain::TataraDomain, read};
#[test]
fn minimal_overlay_compiles() {
let forms = read(
r#"(defoverlay
:name "patched"
:target PackageSet
:description "carries a local patch")"#,
)
.unwrap();
let o = Overlay::compile_from_sexp(&forms[0]).unwrap();
assert_eq!(o.name, "patched");
assert_eq!(o.target, OverlayTarget::PackageSet);
assert!(o.adds.is_empty());
}
}