use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct FederationMigration {
pub source_federation_id: String,
pub target_federation_id: String,
pub migration_epoch: u64,
pub migration_root: [u8; 32],
}
impl FederationMigration {
#[must_use]
pub fn is_valid(&self) -> bool {
if self.source_federation_id == self.target_federation_id {
return false;
}
if self.source_federation_id.is_empty() || self.target_federation_id.is_empty() {
return false;
}
if self.migration_root == [0; 32] {
return false;
}
true
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn valid_migration() {
let mig = FederationMigration {
source_federation_id: "fed-v1".into(),
target_federation_id: "fed-v2".into(),
migration_epoch: 100,
migration_root: [1; 32],
};
assert!(mig.is_valid());
}
#[test]
fn invalid_migration_same_id() {
let mig = FederationMigration {
source_federation_id: "fed-v1".into(),
target_federation_id: "fed-v1".into(),
migration_epoch: 100,
migration_root: [1; 32],
};
assert!(!mig.is_valid());
}
#[test]
fn invalid_migration_zero_root() {
let mig = FederationMigration {
source_federation_id: "fed-v1".into(),
target_federation_id: "fed-v2".into(),
migration_epoch: 100,
migration_root: [0; 32],
};
assert!(!mig.is_valid());
}
}