1use async_trait::async_trait;
2use std::collections::HashMap;
3
4use crate::errors::Result;
5use crate::request::{get, put};
6use crate::{Client, QueryMeta, QueryOptions, WriteMeta, WriteOptions};
7
8#[derive(Clone, Default, Eq, PartialEq, Serialize, Deserialize, Debug)]
9#[serde(default)]
10#[allow(clippy::upper_case_acronyms)]
11pub struct SessionID {
12 pub ID: String,
13}
14
15#[derive(Clone, Default, Eq, PartialEq, Serialize, Deserialize, Debug)]
16#[serde(default)]
17pub struct SessionEntry {
18 pub CreateIndex: Option<u64>,
19 pub ID: Option<String>,
20 pub Name: Option<String>,
21 pub Node: Option<String>,
22 pub LockDelay: Option<u64>, pub Behavior: Option<String>,
24 pub Checks: Option<Vec<String>>,
25 pub TTL: Option<String>,
26}
27
28#[async_trait]
29pub trait Session {
30 async fn create(
31 &self,
32 session: &SessionEntry,
33 options: Option<&WriteOptions>,
34 ) -> Result<(SessionEntry, WriteMeta)>;
35 async fn destroy(&self, id: &str, options: Option<&WriteOptions>) -> Result<(bool, WriteMeta)>;
36 async fn info(
37 &self,
38 id: &str,
39 options: Option<&QueryOptions>,
40 ) -> Result<(Vec<SessionEntry>, QueryMeta)>;
41 async fn list(&self, options: Option<&QueryOptions>) -> Result<(Vec<SessionEntry>, QueryMeta)>;
42 async fn node(
43 &self,
44 node: &str,
45 options: Option<&QueryOptions>,
46 ) -> Result<(Vec<SessionEntry>, QueryMeta)>;
47 async fn renew(
48 &self,
49 id: &str,
50 options: Option<&WriteOptions>,
51 ) -> Result<(Vec<SessionEntry>, WriteMeta)>;
52}
53
54#[async_trait]
55impl Session for Client {
56 async fn create(
57 &self,
58 session: &SessionEntry,
59 options: Option<&WriteOptions>,
60 ) -> Result<(SessionEntry, WriteMeta)> {
61 put(
62 "/v1/session/create",
63 Some(session),
64 &self.config,
65 HashMap::new(),
66 options,
67 )
68 .await
69 }
70 async fn destroy(&self, id: &str, options: Option<&WriteOptions>) -> Result<(bool, WriteMeta)> {
71 let path = format!("/v1/session/destroy/{}", id);
72 put(
73 &path,
74 None as Option<&()>,
75 &self.config,
76 HashMap::new(),
77 options,
78 )
79 .await
80 }
81 async fn info(
82 &self,
83 id: &str,
84 options: Option<&QueryOptions>,
85 ) -> Result<(Vec<SessionEntry>, QueryMeta)> {
86 let path = format!("/v1/session/info/{}", id);
87 get(&path, &self.config, HashMap::new(), options).await
88 }
89 async fn list(&self, options: Option<&QueryOptions>) -> Result<(Vec<SessionEntry>, QueryMeta)> {
90 get("/v1/session/list", &self.config, HashMap::new(), options).await
91 }
92 async fn node(
93 &self,
94 node: &str,
95 options: Option<&QueryOptions>,
96 ) -> Result<(Vec<SessionEntry>, QueryMeta)> {
97 let path = format!("/v1/session/node/{}", node);
98 get(&path, &self.config, HashMap::new(), options).await
99 }
100
101 async fn renew(
102 &self,
103 id: &str,
104 options: Option<&WriteOptions>,
105 ) -> Result<(Vec<SessionEntry>, WriteMeta)> {
106 let path = format!("/v1/session/renew/{}", id);
107 put(
108 &path,
109 None as Option<&()>,
110 &self.config,
111 HashMap::new(),
112 options,
113 )
114 .await
115 }
116}