use std::ops::{Deref, DerefMut};
use std::sync::atomic::{AtomicU8, Ordering};
use std::cell::UnsafeCell;
use std::marker::PhantomData;
#[derive(Debug, PartialEq, Eq, Clone, Copy)]
#[repr(u8)]
pub enum SovereignState {
Domestic = 0,
Exiled = 1,
}
pub struct Sovereign<T> {
inner: UnsafeCell<T>,
state: AtomicU8,
}
impl<T> Sovereign<T> {
pub fn new(value: T) -> Self {
Self {
inner: UnsafeCell::new(value),
state: AtomicU8::new(SovereignState::Domestic as u8),
}
}
pub fn annex(&self) -> Result<(), String> {
let current = self.state.load(Ordering::SeqCst);
if current == SovereignState::Exiled as u8 {
return Err("Resource is already under foreign jurisdiction.".to_string());
}
self.state.store(SovereignState::Exiled as u8, Ordering::SeqCst);
Ok(())
}
pub fn inner_ref(&self) -> &T {
unsafe { &*self.inner.get() }
}
pub fn state(&self) -> SovereignState {
match self.state.load(Ordering::SeqCst) {
0 => SovereignState::Domestic,
_ => SovereignState::Exiled,
}
}
fn verify_jurisdiction(&self) {
if self.state.load(Ordering::SeqCst) == SovereignState::Exiled as u8 {
panic!("SOVEREIGNTY VIOLATION: Resource is under foreign jurisdiction.");
}
}
}
impl<T> Deref for Sovereign<T> {
type Target = T;
fn deref(&self) -> &Self::Target {
self.verify_jurisdiction();
unsafe { &*self.inner.get() }
}
}
impl<T> DerefMut for Sovereign<T> {
fn deref_mut(&mut self) -> &mut Self::Target {
self.verify_jurisdiction();
unsafe { &mut *self.inner.get() }
}
}
unsafe impl<T: Send> Send for Sovereign<T> {}
unsafe impl<T: Sync> Sync for Sovereign<T> {}
pub trait CheckProtocol {
fn enforce_law(&self);
}
#[derive(Debug)]
pub struct ProofCarrying<T> {
pub value: T,
_proof: PhantomData<()>,
}
impl<T> ProofCarrying<T> {
#[doc(hidden)]
pub fn new_unchecked(value: T) -> Self {
Self {
value,
_proof: PhantomData,
}
}
pub fn into_inner(self) -> T {
self.value
}
}
impl<T: Clone> Clone for ProofCarrying<T> {
fn clone(&self) -> Self {
Self {
value: self.value.clone(),
_proof: PhantomData,
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum AnnexError {
AlreadyExiled,
VerificationFailed(String),
ProverError(String),
}
impl std::fmt::Display for AnnexError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
AnnexError::AlreadyExiled => write!(f, "Resource is already under foreign jurisdiction"),
AnnexError::VerificationFailed(msg) => write!(f, "Verification failed: {}", msg),
AnnexError::ProverError(msg) => write!(f, "Prover error: {}", msg),
}
}
}
impl std::error::Error for AnnexError {}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum LeaseError {
AlreadyLeased,
ForeignJurisdiction,
}
pub struct Lease<T> {
pub holder: u128,
pub duration: std::time::Duration,
_phantom: PhantomData<T>,
}
impl<T> Lease<T> {
pub fn new(holder: u128, duration: std::time::Duration) -> Self {
Self {
holder,
duration,
_phantom: PhantomData,
}
}
}
pub trait DistributedBorrow<T> {
fn try_hire(&self, candidate_id: u128, term: std::time::Duration) -> Result<Lease<T>, LeaseError>;
}
impl<T> DistributedBorrow<T> for Sovereign<T> {
fn try_hire(&self, candidate_id: u128, term: std::time::Duration) -> Result<Lease<T>, LeaseError> {
let current = self.state.load(Ordering::SeqCst);
if current == SovereignState::Exiled as u8 {
return Err(LeaseError::AlreadyLeased);
}
self.state.store(SovereignState::Exiled as u8, Ordering::SeqCst);
Ok(Lease::new(candidate_id, term))
}
}
pub trait VerifiedAnnex<T> {
fn annex_verified(&self) -> Result<ProofCarrying<()>, AnnexError>;
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_sovereign_new() {
let s = Sovereign::new(42i32);
assert_eq!(s.state(), SovereignState::Domestic);
}
#[test]
fn test_sovereign_deref() {
let s = Sovereign::new(42i32);
assert_eq!(*s, 42);
}
#[test]
fn test_sovereign_deref_mut() {
let mut s = Sovereign::new(42i32);
*s = 100;
assert_eq!(*s, 100);
}
#[test]
fn test_sovereign_annex() {
let s = Sovereign::new(42i32);
assert!(s.annex().is_ok());
assert_eq!(s.state(), SovereignState::Exiled);
}
#[test]
fn test_sovereign_double_annex() {
let s = Sovereign::new(42i32);
assert!(s.annex().is_ok());
assert!(s.annex().is_err());
}
#[test]
#[should_panic(expected = "SOVEREIGNTY VIOLATION")]
fn test_sovereignty_violation() {
let s = Sovereign::new(42i32);
s.annex().unwrap();
let _ = *s; }
#[test]
fn test_proof_carrying() {
let proof = ProofCarrying::new_unchecked(42i32);
assert_eq!(proof.value, 42);
assert_eq!(proof.into_inner(), 42);
}
#[test]
fn test_annex_error_display() {
let e = AnnexError::AlreadyExiled;
assert!(e.to_string().contains("foreign jurisdiction"));
let e = AnnexError::VerificationFailed("test".to_string());
assert!(e.to_string().contains("test"));
}
}