use thiserror::Error;
use tatara_nix::derivation::Derivation;
#[derive(Debug, Error)]
pub enum PackageSetError {
#[error("unknown package: {0}")]
Unknown(String),
#[error("backend: {0}")]
Backend(String),
}
pub type PackageLookup = Option<Derivation>;
pub trait PackageSet: Send + Sync {
fn get(&self, name: &str) -> Result<PackageLookup, PackageSetError>;
fn names(&self) -> Vec<String>;
fn label(&self) -> &str {
"anonymous"
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn error_display_unknown() {
let e = PackageSetError::Unknown("curl".into());
assert_eq!(e.to_string(), "unknown package: curl");
}
#[test]
fn error_display_backend() {
let e = PackageSetError::Backend("nix eval timed out".into());
assert_eq!(e.to_string(), "backend: nix eval timed out");
}
#[test]
fn default_label_is_anonymous() {
struct Empty;
impl PackageSet for Empty {
fn get(&self, _name: &str) -> Result<PackageLookup, PackageSetError> {
Ok(None)
}
fn names(&self) -> Vec<String> {
vec![]
}
}
assert_eq!(Empty.label(), "anonymous");
}
#[test]
fn custom_label_override_wins() {
struct Labeled;
impl PackageSet for Labeled {
fn get(&self, _name: &str) -> Result<PackageLookup, PackageSetError> {
Ok(None)
}
fn names(&self) -> Vec<String> {
vec![]
}
fn label(&self) -> &str {
"custom-label"
}
}
assert_eq!(Labeled.label(), "custom-label");
}
#[test]
fn package_lookup_is_option_derivation_alias() {
let none: PackageLookup = None;
assert!(none.is_none());
}
}