use std::collections::HashMap;
use std::time::Duration;
use serde::{self, Deserialize, Serialize, Serializer};
use smart_default::SmartDefault;
#[derive(Debug, Clone)]
pub struct QueryOptions {
pub namespace: Option<String>,
pub datacenter: Option<String>,
pub timeout: Option<Duration>,
pub index: Option<u64>,
pub wait: Option<Duration>,
}
impl Default for QueryOptions {
fn default() -> Self {
Self {
namespace: None,
datacenter: None,
timeout: Some(Duration::from_secs(5)),
index: None,
wait: None,
}
}
}
#[derive(Debug)]
pub struct ResponseMeta<T> {
pub response: T,
pub index: u64,
}
#[derive(Clone, Debug, SmartDefault, Serialize, Deserialize, PartialEq, bon::Builder)]
pub struct DeleteKeyRequest<'a> {
pub key: &'a str,
#[builder(default)]
pub datacenter: &'a str,
#[builder(default)]
pub recurse: bool,
#[builder(default)]
pub check_and_set: u32,
#[builder(default)]
pub namespace: &'a str,
}
#[derive(Clone, Debug, SmartDefault, Serialize, Deserialize, PartialEq, bon::Builder)]
pub struct ReadKeyRequest<'a> {
pub key: &'a str,
#[builder(default)]
pub namespace: &'a str,
#[builder(default)]
pub datacenter: &'a str,
#[builder(default)]
pub recurse: bool,
#[builder(default)]
pub separator: &'a str,
#[builder(default)]
pub consistency: ConsistencyMode,
pub index: Option<u64>,
#[builder(default)]
pub wait: Duration,
}
#[derive(Clone, Debug, SmartDefault, Serialize, Deserialize, PartialEq, bon::Builder)]
pub struct LockWatchRequest<'a> {
pub key: &'a str,
#[builder(default)]
pub datacenter: &'a str,
#[builder(default)]
pub namespace: &'a str,
#[builder(default)]
pub consistency: ConsistencyMode,
pub index: Option<u64>,
#[builder(default)]
pub wait: Duration,
}
#[derive(Clone, Debug, SmartDefault, Serialize, Deserialize, PartialEq, bon::Builder)]
pub struct CreateOrUpdateKeyRequest<'a> {
pub key: &'a str,
#[builder(default)]
pub namespace: &'a str,
#[builder(default)]
pub datacenter: &'a str,
#[builder(default)]
pub flags: u64,
pub check_and_set: Option<i64>,
#[builder(default)]
pub acquire: &'a str,
#[builder(default)]
pub release: &'a str,
}
#[derive(Clone, Debug, SmartDefault, Serialize, Deserialize, PartialEq)]
#[serde(rename_all = "PascalCase")]
pub struct ReadKeyResponse {
pub create_index: i64,
pub modify_index: i64,
pub lock_index: i64,
pub key: String,
pub flags: u64,
pub value: Option<String>,
pub session: Option<String>,
}
#[derive(Clone, Debug, SmartDefault, Serialize, Deserialize, PartialEq, Copy, bon::Builder)]
#[serde(rename_all = "PascalCase")]
pub struct LockRequest<'a> {
pub key: &'a str,
#[builder(default)]
pub session_id: &'a str,
#[builder(default)]
pub namespace: &'a str,
#[builder(default)]
pub datacenter: &'a str,
#[default(_code = "Duration::from_secs(10)")]
#[builder(default = Duration::from_secs(10))]
pub timeout: Duration,
#[builder(default)]
pub behavior: LockExpirationBehavior,
#[default(_code = "Duration::from_secs(1)")]
#[builder(default = Duration::from_secs(1))]
pub lock_delay: Duration,
}
#[derive(Clone, Debug, SmartDefault, Serialize, Deserialize, PartialEq, Copy)]
#[serde(rename_all = "snake_case")]
pub enum LockExpirationBehavior {
#[default]
Release,
Delete,
}
#[derive(Clone, Debug, SmartDefault, Serialize, Deserialize, PartialEq)]
#[serde(rename_all = "PascalCase")]
pub enum ConsistencyMode {
#[default]
Default,
Consistent,
Stale,
}
#[derive(Clone, Debug, SmartDefault, Serialize, Deserialize, PartialEq, bon::Builder)]
pub(crate) struct SessionResponse {
#[serde(rename = "ID")]
pub(crate) id: String,
}
#[derive(Clone, Debug, SmartDefault, Serialize, Deserialize, PartialEq)]
#[serde(rename_all = "PascalCase")]
pub(crate) struct CreateSessionRequest {
#[default(_code = "Duration::from_secs(0)")]
#[serde(serialize_with = "serialize_duration_as_string")]
pub(crate) lock_delay: Duration,
#[serde(skip_serializing_if = "std::string::String::is_empty")]
pub(crate) name: String,
#[serde(skip_serializing_if = "std::string::String::is_empty")]
pub(crate) node: String,
#[serde(skip_serializing_if = "std::vec::Vec::is_empty")]
pub(crate) checks: Vec<String>,
pub(crate) behavior: LockExpirationBehavior,
#[serde(rename = "TTL")]
#[default(_code = "Duration::from_secs(10)")]
#[serde(serialize_with = "serialize_duration_as_string")]
pub(crate) ttl: Duration,
}
#[allow(non_snake_case)]
#[derive(Clone, Debug, Serialize, Deserialize, bon::Builder)]
pub struct RegisterEntityPayload {
#[serde(skip_serializing_if = "Option::is_none")]
pub ID: Option<String>,
pub Node: String,
pub Address: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub Datacenter: Option<String>,
#[serde(skip_serializing_if = "HashMap::is_empty")]
#[builder(default)]
pub TaggedAddresses: HashMap<String, String>,
#[serde(skip_serializing_if = "HashMap::is_empty")]
#[builder(default)]
pub NodeMeta: HashMap<String, String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub Service: Option<RegisterEntityService>,
#[serde(skip_serializing_if = "Vec::is_empty")]
#[builder(default)]
pub Checks: Vec<RegisterEntityCheck>,
#[serde(skip_serializing_if = "Option::is_none")]
pub SkipNodeUpdate: Option<bool>,
}
#[allow(non_snake_case)]
#[derive(Clone, Debug, Serialize, Deserialize, bon::Builder)]
pub struct DeregisterEntityPayload {
#[serde(skip_serializing_if = "Option::is_none")]
pub Node: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub Datacenter: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub CheckID: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub ServiceID: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub Namespace: Option<String>,
}
#[allow(non_snake_case)]
#[derive(Clone, Debug, Serialize, Deserialize, bon::Builder)]
pub struct RegisterEntityService {
#[serde(skip_serializing_if = "Option::is_none")]
pub ID: Option<String>,
pub Service: String,
#[serde(skip_serializing_if = "Vec::is_empty")]
#[builder(default)]
pub Tags: Vec<String>,
#[serde(skip_serializing_if = "HashMap::is_empty")]
#[builder(default)]
pub TaggedAddresses: HashMap<String, String>,
#[serde(skip_serializing_if = "HashMap::is_empty")]
#[builder(default)]
pub Meta: HashMap<String, String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub Port: Option<u16>,
#[serde(skip_serializing_if = "Option::is_none")]
pub Namespace: Option<String>,
}
#[allow(non_snake_case)]
#[derive(Clone, Debug, Serialize, Deserialize, bon::Builder)]
pub struct RegisterEntityCheck {
#[serde(skip_serializing_if = "Option::is_none")]
pub Node: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub CheckID: Option<String>,
pub Name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub Notes: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub Status: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub ServiceID: Option<String>,
#[serde(skip_serializing_if = "HashMap::is_empty")]
#[builder(default)]
pub Definition: HashMap<String, String>,
}
#[derive(Clone, Debug, SmartDefault, Serialize, Deserialize, PartialEq, bon::Builder)]
pub struct GetNodesRequest<'a> {
pub near: Option<&'a str>,
pub filter: Option<&'a str>,
}
#[allow(non_snake_case)]
#[derive(Clone, Debug, SmartDefault, Serialize, Deserialize, PartialEq)]
#[serde(rename_all = "PascalCase")]
pub struct CatalogNode {
#[serde(rename = "ID")]
pub id: String,
pub node: String,
pub address: String,
pub datacenter: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub TaggedAddresses: Option<HashMap<String, String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub Meta: Option<HashMap<String, String>>,
}
pub(crate) type GetNodesResponse = Vec<CatalogNode>;
#[derive(Clone, Debug, SmartDefault, Serialize, Deserialize, PartialEq, bon::Builder)]
pub struct GetServiceNodesRequest<'a> {
pub service: &'a str,
pub near: Option<&'a str>,
#[builder(default)]
pub passing: bool,
pub filter: Option<&'a str>,
}
pub(crate) type GetServiceNodesResponse = Vec<ServiceNode>;
#[derive(Clone, Debug, SmartDefault, Serialize, Deserialize, PartialEq)]
#[serde(rename_all = "PascalCase")]
pub struct ServiceNode {
pub node: Node,
pub service: Service,
}
#[derive(Clone, Debug, SmartDefault, Serialize, Deserialize, PartialEq)]
#[serde(rename_all = "PascalCase")]
pub struct Node {
#[serde(rename = "ID")]
pub id: String,
pub node: String,
pub address: String,
pub datacenter: String,
}
#[derive(Clone, Debug, SmartDefault, Serialize, Deserialize, PartialEq)]
#[serde(rename_all = "PascalCase")]
pub struct Service {
#[serde(rename = "ID")]
pub id: String,
pub service: String,
pub address: String,
pub port: u16,
pub tags: Vec<String>,
}
pub(crate) fn serialize_duration_as_string<S>(
duration: &Duration,
serializer: S,
) -> std::result::Result<S::Ok, S::Error>
where
S: Serializer,
{
let mut res = duration.as_secs().to_string();
res.push('s');
serializer.serialize_str(&res)
}
pub(crate) fn duration_as_string(duration: &Duration) -> String {
let mut res = duration.as_secs().to_string();
res.push('s');
res
}