Skip to main content

north_consul/
session.rs

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>, //TODO: Change this to a Durations
23    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}