use crate::types::EntityId;
pub trait Persisted {}
#[derive(
Debug, Clone, Copy, Default, PartialEq, Eq, Hash, serde::Serialize, serde::Deserialize,
)]
pub enum Uninterruptible {
#[default]
No,
Client,
Server,
Both,
}
impl Uninterruptible {
pub fn is_server_uninterruptible(&self) -> bool {
matches!(self, Uninterruptible::Server | Uninterruptible::Both)
}
pub fn is_client_uninterruptible(&self) -> bool {
matches!(self, Uninterruptible::Client | Uninterruptible::Both)
}
}
pub trait ShardGroupResolver: Send + Sync {
fn resolve(&self, entity_id: &EntityId) -> String;
}
pub struct DefaultShardGroupResolver;
impl ShardGroupResolver for DefaultShardGroupResolver {
fn resolve(&self, _entity_id: &EntityId) -> String {
"default".to_string()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn uninterruptible_default_is_no() {
assert_eq!(Uninterruptible::default(), Uninterruptible::No);
}
#[test]
fn uninterruptible_server_checks() {
assert!(!Uninterruptible::No.is_server_uninterruptible());
assert!(!Uninterruptible::Client.is_server_uninterruptible());
assert!(Uninterruptible::Server.is_server_uninterruptible());
assert!(Uninterruptible::Both.is_server_uninterruptible());
}
#[test]
fn uninterruptible_client_checks() {
assert!(!Uninterruptible::No.is_client_uninterruptible());
assert!(Uninterruptible::Client.is_client_uninterruptible());
assert!(!Uninterruptible::Server.is_client_uninterruptible());
assert!(Uninterruptible::Both.is_client_uninterruptible());
}
#[test]
fn default_shard_group_resolver() {
let resolver = DefaultShardGroupResolver;
let id = EntityId("test-123".to_string());
assert_eq!(resolver.resolve(&id), "default");
}
#[test]
fn uninterruptible_serde_roundtrip() {
for variant in [
Uninterruptible::No,
Uninterruptible::Client,
Uninterruptible::Server,
Uninterruptible::Both,
] {
let bytes = rmp_serde::to_vec(&variant).unwrap();
let decoded: Uninterruptible = rmp_serde::from_slice(&bytes).unwrap();
assert_eq!(decoded, variant);
}
}
struct MyPersistedRequest;
impl Persisted for MyPersistedRequest {}
#[test]
fn persisted_marker_trait_compiles() {
fn _accepts_persisted<T: Persisted>(_t: &T) {}
let req = MyPersistedRequest;
_accepts_persisted(&req);
}
}