use std::collections::HashMap;
use crate::types::identifiers::{QualifiedIdentifier, RelIdentifier};
use crate::types::media::MediaType;
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum MediaHandler {
BuiltinAggSingleJson(bool),
BuiltinAggArrayJsonStrip,
BuiltinOvAggJson,
BuiltinOvAggCsv,
BuiltinOvAggGeoJson,
CustomFunc(QualifiedIdentifier, RelIdentifier),
NoAgg,
}
impl MediaHandler {
pub fn is_builtin(&self) -> bool {
!matches!(self, MediaHandler::CustomFunc(_, _) | MediaHandler::NoAgg)
}
pub fn is_custom(&self) -> bool {
matches!(self, MediaHandler::CustomFunc(_, _))
}
}
pub type ResolvedHandler = (MediaHandler, MediaType);
pub type MediaHandlerMap = HashMap<(RelIdentifier, MediaType), ResolvedHandler>;
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_media_handler_builtin() {
assert!(MediaHandler::BuiltinOvAggJson.is_builtin());
assert!(MediaHandler::BuiltinOvAggCsv.is_builtin());
assert!(MediaHandler::BuiltinAggSingleJson(true).is_builtin());
assert!(MediaHandler::BuiltinAggArrayJsonStrip.is_builtin());
assert!(!MediaHandler::NoAgg.is_builtin());
}
#[test]
fn test_media_handler_custom() {
let custom = MediaHandler::CustomFunc(
QualifiedIdentifier::new("public", "to_geojson"),
RelIdentifier::any_element(),
);
assert!(custom.is_custom());
assert!(!custom.is_builtin());
}
#[test]
fn test_media_handler_map() {
let mut map: MediaHandlerMap = HashMap::new();
let key = (RelIdentifier::any_element(), MediaType::ApplicationJson);
let handler = (MediaHandler::BuiltinOvAggJson, MediaType::ApplicationJson);
map.insert(key.clone(), handler);
assert!(map.contains_key(&key));
assert_eq!(map.len(), 1);
}
#[test]
fn test_media_handler_equality() {
assert_eq!(
MediaHandler::BuiltinOvAggJson,
MediaHandler::BuiltinOvAggJson
);
assert_ne!(
MediaHandler::BuiltinOvAggJson,
MediaHandler::BuiltinOvAggCsv
);
assert_eq!(
MediaHandler::BuiltinAggSingleJson(true),
MediaHandler::BuiltinAggSingleJson(true)
);
assert_ne!(
MediaHandler::BuiltinAggSingleJson(true),
MediaHandler::BuiltinAggSingleJson(false)
);
}
}