Skip to main content

agent_first_pay/types/
limits.rs

1use serde::{Deserialize, Serialize};
2
3#[derive(Debug, Clone, Serialize, Deserialize)]
4pub struct SpendDebit {
5    pub amount_native: u64,
6    #[serde(default, skip_serializing_if = "Option::is_none")]
7    pub token: Option<String>,
8}
9
10#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
11#[serde(rename_all = "snake_case")]
12pub enum SpendScope {
13    #[serde(alias = "all")]
14    GlobalUsdCents,
15    Network,
16    Wallet,
17}
18
19fn default_spend_scope_network() -> SpendScope {
20    SpendScope::Network
21}
22
23#[derive(Debug, Clone, Serialize, Deserialize)]
24pub struct SpendLimit {
25    #[serde(default, skip_serializing_if = "Option::is_none")]
26    pub rule_id: Option<String>,
27    #[serde(default = "default_spend_scope_network")]
28    pub scope: SpendScope,
29    #[serde(default, skip_serializing_if = "Option::is_none")]
30    pub network: Option<String>,
31    #[serde(default, skip_serializing_if = "Option::is_none")]
32    pub wallet: Option<String>,
33    pub window_s: u64,
34    pub max_spend: u64,
35    #[serde(default, skip_serializing_if = "Option::is_none")]
36    pub token: Option<String>,
37}
38
39#[derive(Debug, Clone, Serialize, Deserialize)]
40pub struct SpendLimitStatus {
41    pub rule_id: String,
42    pub scope: SpendScope,
43    #[serde(default, skip_serializing_if = "Option::is_none")]
44    pub network: Option<String>,
45    #[serde(default, skip_serializing_if = "Option::is_none")]
46    pub wallet: Option<String>,
47    pub window_s: u64,
48    pub max_spend: u64,
49    pub spent: u64,
50    pub remaining: u64,
51    #[serde(default, skip_serializing_if = "Option::is_none")]
52    pub token: Option<String>,
53    pub window_reset_s: u64,
54}
55
56#[derive(Debug, Clone, Serialize, Deserialize)]
57pub struct DownstreamLimitNode {
58    pub name: String,
59    pub endpoint: String,
60    #[serde(default, skip_serializing_if = "Vec::is_empty")]
61    pub limits: Vec<SpendLimitStatus>,
62    #[serde(default, skip_serializing_if = "Option::is_none")]
63    pub error: Option<String>,
64    #[serde(default, skip_serializing_if = "Vec::is_empty")]
65    pub downstream: Vec<DownstreamLimitNode>,
66}