use crate::config::{MirrorConfig, MirrorProviderSlot};
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub enum Capability {
S3,
Pg,
Smtp,
}
impl Capability {
pub fn wire_name(self) -> &'static str {
match self {
Self::S3 => "s3",
Self::Pg => "pg",
Self::Smtp => "smtp",
}
}
pub fn for_component_kind(kind: &str) -> &'static [Capability] {
match kind {
"mesofact-static" | "mesofact-spa" | "static-asset" => &[Capability::S3],
_ => &[],
}
}
}
impl MirrorConfig {
pub fn driver(&self, capability: Capability) -> Option<&MirrorProviderSlot> {
self.drivers.get(capability.wire_name())
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::config::{MirrorShape, Provider};
fn mirror_with(toml_src: &str) -> MirrorConfig {
toml::from_str(toml_src).expect("parse mirror")
}
#[test]
fn static_shaped_kinds_imply_s3_and_nothing_else_does() {
for kind in ["mesofact-static", "mesofact-spa", "static-asset"] {
assert_eq!(
Capability::for_component_kind(kind),
&[Capability::S3],
"{kind} should imply s3"
);
}
for kind in [
"cloudflare-worker",
"mesofact-bundle",
"not-a-real-kind",
"",
] {
assert!(
Capability::for_component_kind(kind).is_empty(),
"{kind} should imply nothing"
);
}
}
#[test]
fn drivers_table_parses_and_resolves_by_capability() {
let mirror = mirror_with(
r#"
schema_version = 1
shape = "local"
[drivers.pg]
kind = "local-pg-dev"
"#,
);
assert!(matches!(mirror.shape, MirrorShape::Local));
let slot = mirror.driver(Capability::Pg).expect("pg driver bound");
assert_eq!(slot.inline_kind(), Some(Provider::LocalPgDev));
assert!(mirror.driver(Capability::S3).is_none());
}
#[test]
fn the_smtp_capability_binds_the_mailcrab_driver() {
let mirror = mirror_with(
r#"
schema_version = 1
shape = "local"
[drivers.smtp]
kind = "local-mailcrab"
"#,
);
let slot = mirror.driver(Capability::Smtp).expect("smtp driver bound");
assert_eq!(slot.inline_kind(), Some(Provider::LocalMailcrab));
assert!(mirror.driver(Capability::Pg).is_none());
}
#[test]
fn the_s3_capability_binds_the_dev_fs_driver() {
let mirror = mirror_with(
r#"
schema_version = 1
shape = "local"
[drivers.s3]
kind = "local-s3-fs"
"#,
);
let slot = mirror.driver(Capability::S3).expect("s3 driver bound");
assert_eq!(slot.inline_kind(), Some(Provider::LocalS3Fs));
assert!(mirror.driver(Capability::Pg).is_none());
}
#[test]
fn wire_names_are_distinct_and_toml_key_shaped() {
let all = [Capability::S3, Capability::Pg, Capability::Smtp];
let names: std::collections::BTreeSet<_> = all.iter().map(|c| c.wire_name()).collect();
assert_eq!(names.len(), all.len(), "duplicate wire_name: {names:?}");
for name in names {
assert!(
!name.is_empty()
&& name
.chars()
.all(|c| c.is_ascii_lowercase() || c.is_ascii_digit()),
"{name} is not a bare lowercase TOML key"
);
}
}
#[test]
fn a_mirror_with_no_drivers_table_is_unchanged() {
let mirror = mirror_with(
r#"
schema_version = 1
shape = "local"
[providers.static]
kind = "miniflare-native"
port = 4324
"#,
);
assert!(mirror.drivers.is_empty());
assert!(mirror.driver(Capability::Pg).is_none());
let back = toml::to_string(&mirror).expect("serialize");
assert!(
!back.contains("drivers"),
"unexpected drivers table: {back}"
);
}
}