edc_connector_client/api/
transfer_process.rs1use crate::{
2 client::EdcConnectorClientInternal,
3 types::{
4 context::{WithContext, WithContextRef},
5 query::Query,
6 response::IdResponse,
7 transfer_process::{
8 SuspendTransfer, TerminateTransfer, TransferProcess, TransferProcessState,
9 TransferRequest, TransferState,
10 },
11 },
12 EdcResult,
13};
14
15pub struct TransferProcessApi<'a>(&'a EdcConnectorClientInternal);
16
17impl<'a> TransferProcessApi<'a> {
18 pub(crate) fn new(client: &'a EdcConnectorClientInternal) -> TransferProcessApi<'a> {
19 TransferProcessApi(client)
20 }
21
22 pub async fn initiate(
23 &self,
24 transfer_request: &TransferRequest,
25 ) -> EdcResult<IdResponse<String>> {
26 let url = self.get_endpoint(&[]);
27 self.0
28 .post::<_, WithContext<IdResponse<String>>>(
29 url,
30 &WithContextRef::default_context(transfer_request),
31 )
32 .await
33 .map(|ctx| ctx.inner)
34 }
35
36 pub async fn get(&self, id: &str) -> EdcResult<TransferProcess> {
37 let url = self.get_endpoint(&[id]);
38 self.0
39 .get::<WithContext<TransferProcess>>(url)
40 .await
41 .map(|ctx| ctx.inner)
42 }
43
44 pub async fn get_state(&self, id: &str) -> EdcResult<TransferProcessState> {
45 let url = self.get_endpoint(&[id]);
46 self.0
47 .get::<WithContext<TransferState>>(url)
48 .await
49 .map(|ctx| ctx.inner.state().clone())
50 }
51
52 pub async fn query(&self, query: Query) -> EdcResult<Vec<TransferProcess>> {
53 let url = self.get_endpoint(&["request"]);
54 self.0
55 .post::<_, Vec<WithContext<TransferProcess>>>(
56 url,
57 &WithContextRef::default_context(&query),
58 )
59 .await
60 .map(|results| results.into_iter().map(|ctx| ctx.inner).collect())
61 }
62
63 pub async fn terminate(&self, id: &str, reason: &str) -> EdcResult<()> {
64 let url = self.get_endpoint(&[id, "terminate"]);
65
66 let request = TerminateTransfer {
67 id: id.to_string(),
68 reason: reason.to_string(),
69 };
70 self.0
71 .post_no_response(url, &WithContextRef::default_context(&request))
72 .await
73 .map(|_| ())
74 }
75
76 pub async fn suspend(&self, id: &str, reason: &str) -> EdcResult<()> {
77 let url = self.get_endpoint(&[id, "suspend"]);
78
79 let request = SuspendTransfer {
80 id: id.to_string(),
81 reason: reason.to_string(),
82 };
83 self.0
84 .post_no_response(url, &WithContextRef::default_context(&request))
85 .await
86 .map(|_| ())
87 }
88
89 pub async fn resume(&self, id: &str) -> EdcResult<()> {
90 let url = self.get_endpoint(&[id, "resume"]);
91 self.0
92 .post_no_response(url, &Option::<()>::None)
93 .await
94 .map(|_| ())
95 }
96
97 fn get_endpoint(&self, paths: &[&str]) -> String {
98 [self.0.management_url.as_str(), "v3", "transferprocesses"]
99 .into_iter()
100 .chain(paths.iter().copied())
101 .collect::<Vec<_>>()
102 .join("/")
103 }
104}