use serde::Serialize;
use super::common::{Action, Amount, CyclesMetrics, Subject};
use super::enums::CommitOveragePolicy;
use super::ids::IdempotencyKey;
#[derive(Debug, Clone, Serialize, bon::Builder)]
pub struct ReservationCreateRequest {
#[builder(default = IdempotencyKey::random())]
pub idempotency_key: IdempotencyKey,
pub subject: Subject,
pub action: Action,
pub estimate: Amount,
#[builder(default = 60_000)]
pub ttl_ms: u64,
#[serde(skip_serializing_if = "Option::is_none")]
pub grace_period_ms: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub overage_policy: Option<CommitOveragePolicy>,
#[builder(default)]
#[serde(skip_serializing_if = "is_false")]
pub dry_run: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub metadata: Option<serde_json::Value>,
}
#[derive(Debug, Clone, Serialize, bon::Builder)]
pub struct CommitRequest {
#[builder(default = IdempotencyKey::random())]
pub idempotency_key: IdempotencyKey,
pub actual: Amount,
#[serde(skip_serializing_if = "Option::is_none")]
pub metrics: Option<CyclesMetrics>,
#[serde(skip_serializing_if = "Option::is_none")]
pub metadata: Option<serde_json::Value>,
}
#[derive(Debug, Clone, Serialize)]
pub struct ReleaseRequest {
pub idempotency_key: IdempotencyKey,
#[serde(skip_serializing_if = "Option::is_none")]
pub reason: Option<String>,
}
impl ReleaseRequest {
pub fn new(reason: Option<String>) -> Self {
Self {
idempotency_key: IdempotencyKey::random(),
reason,
}
}
}
#[derive(Debug, Clone, Serialize)]
pub struct ExtendRequest {
pub idempotency_key: IdempotencyKey,
pub extend_by_ms: u64,
#[serde(skip_serializing_if = "Option::is_none")]
pub metadata: Option<serde_json::Value>,
}
impl ExtendRequest {
pub fn new(extend_by_ms: u64) -> Self {
Self {
idempotency_key: IdempotencyKey::random(),
extend_by_ms,
metadata: None,
}
}
}
#[derive(Debug, Clone, Serialize, bon::Builder)]
pub struct DecisionRequest {
#[builder(default = IdempotencyKey::random())]
pub idempotency_key: IdempotencyKey,
pub subject: Subject,
pub action: Action,
pub estimate: Amount,
#[serde(skip_serializing_if = "Option::is_none")]
pub metadata: Option<serde_json::Value>,
}
#[derive(Debug, Clone, Serialize, bon::Builder)]
pub struct EventCreateRequest {
#[builder(default = IdempotencyKey::random())]
pub idempotency_key: IdempotencyKey,
pub subject: Subject,
pub action: Action,
pub actual: Amount,
#[serde(skip_serializing_if = "Option::is_none")]
pub overage_policy: Option<CommitOveragePolicy>,
#[serde(skip_serializing_if = "Option::is_none")]
pub metrics: Option<CyclesMetrics>,
#[serde(skip_serializing_if = "Option::is_none")]
pub client_time_ms: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub metadata: Option<serde_json::Value>,
}
#[derive(Debug, Clone, Default, Serialize)]
pub struct ListReservationsParams {
#[serde(skip_serializing_if = "Option::is_none")]
pub status: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tenant: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub app: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub agent: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub cursor: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub limit: Option<u32>,
}
#[derive(Debug, Clone, Default, Serialize)]
pub struct BalanceParams {
#[serde(skip_serializing_if = "Option::is_none")]
pub tenant: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub workspace: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub app: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub workflow: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub agent: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub toolset: Option<String>,
}
impl BalanceParams {
pub fn has_filter(&self) -> bool {
self.tenant.is_some()
|| self.workspace.is_some()
|| self.app.is_some()
|| self.workflow.is_some()
|| self.agent.is_some()
|| self.toolset.is_some()
}
}
fn is_false(v: &bool) -> bool {
!v
}