use serde::{Deserialize, Serialize};
pub trait Extension:
Serialize + for<'de> Deserialize<'de> + Clone + std::fmt::Debug + Default + PartialEq + Send + Sync
{
}
impl<T> Extension for T where
T: Serialize
+ for<'de> Deserialize<'de>
+ Clone
+ std::fmt::Debug
+ Default
+ PartialEq
+ Send
+ Sync
{
}
pub type DefaultExt = Vec<u8>;
#[cfg(test)]
mod tests {
use super::*;
#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
struct TestExtension {
field1: String,
field2: i32,
}
#[test]
fn test_custom_type_implements_extension() {
fn requires_extension<E: Extension>(_ext: E) {}
let ext = TestExtension {
field1: "test".to_string(),
field2: 42,
};
requires_extension(ext);
}
#[test]
fn test_json_value_implements_extension() {
fn requires_extension<E: Extension>(_ext: E) {}
let ext = serde_json::json!({"key": "value"});
requires_extension(ext);
}
#[test]
fn test_unit_type_implements_extension() {
fn requires_extension<E: Extension>(_ext: E) {}
requires_extension(());
}
#[test]
fn test_option_implements_extension() {
fn requires_extension<E: Extension>(_ext: Option<E>) {}
let ext: Option<TestExtension> = Some(TestExtension::default());
requires_extension(ext);
}
#[test]
fn test_vec_u8_implements_extension() {
fn requires_extension<E: Extension>(_ext: E) {}
let ext: Vec<u8> = vec![0x08, 0x96, 0x01];
requires_extension(ext);
}
#[test]
fn test_default_ext_is_vec_u8() {
let ext = DefaultExt::default();
assert!(ext.is_empty());
assert_eq!(ext, Vec::<u8>::new());
}
}