use serde::{Deserialize, Serialize};
use crate::{api::shared::v1::RangeQueryContext, base64::Base64Encoded, impl_base64};
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq)]
#[serde(transparent)]
pub struct LockName {
inner: Base64Encoded,
}
impl_base64!(LockName);
#[derive(Debug, Deserialize, Serialize, Clone, PartialEq, Eq)]
#[serde(transparent)]
pub struct LockId {
inner: Base64Encoded,
}
impl_base64!(LockId);
#[derive(Debug, Serialize, PartialEq, Eq)]
pub struct HeldLock {
pub(crate) name: LockName,
pub(crate) id: LockId,
pub(crate) sequencer: u32,
}
impl HeldLock {
pub fn name(&self) -> &LockName { &self.name }
pub fn id(&self) -> &LockId { &self.id }
pub fn sequencer(&self) -> u32 { self.sequencer }
pub fn new(name: LockName, id: LockId, sequencer: u32) -> HeldLock {
HeldLock { name, id, sequencer }
}
}
#[non_exhaustive]
#[derive(Debug)]
pub enum RequestTarget {
SingleLock(LockName),
HeldLock(HeldLock),
Range(RangeQueryContext<LockName>),
}
#[derive(Deserialize, Serialize, Debug, PartialEq, Eq)]
pub struct LockInfo {
pub name: LockName,
pub id: LockId,
pub info: LockInfoInner,
}
#[derive(Deserialize, Serialize, Debug, PartialEq, Eq)]
pub struct LockInfoInner {
pub ttl: u32,
#[serde(rename = "client-id")]
pub client_id: String,
pub ip: String,
}
#[derive(Debug, Serialize, Deserialize, PartialEq, Eq)]
pub struct LockInfoRange {
pub next: Option<LockName>,
pub locks: Vec<LockInfo>,
}