Skip to content

Commit 14a2f03

Browse files
authored
And the into_future changes continue (#669)
* ReplacePermission::into_future * ReplaceUser::into_future * StoredProcedure create and replace
1 parent 6f35e13 commit 14a2f03

18 files changed

+349
-307
lines changed

sdk/data_cosmos/examples/permission_00.rs

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
use azure_core::prelude::*;
21
use azure_data_cosmos::prelude::*;
32
use std::error::Error;
43

@@ -110,19 +109,16 @@ async fn main() -> Result<(), Box<dyn Error + Send + Sync>> {
110109
.unwrap();
111110
println!("get_permission_response == {:#?}", get_permission_response);
112111

113-
let permission_mode = &get_permission_response.permission.permission_mode;
112+
let permission_mode = get_permission_response.permission.permission_mode;
114113

115114
// renew permission extending its validity for 60 seconds more.
116115
let replace_permission_response = permission_client
117-
.replace_permission(
118-
Context::new(),
119-
ReplacePermissionOptions::new()
120-
.expiry_seconds(600u64)
121-
.consistency_level(ConsistencyLevel::Session(
122-
get_permission_response.session_token,
123-
)),
124-
permission_mode,
125-
)
116+
.replace_permission(permission_mode)
117+
.expiry_seconds(600u64)
118+
.consistency_level(ConsistencyLevel::Session(
119+
get_permission_response.session_token,
120+
))
121+
.into_future()
126122
.await
127123
.unwrap();
128124
println!(

sdk/data_cosmos/examples/stored_proc_01.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,8 @@ async fn main() -> Result<(), Box<dyn Error + Send + Sync>> {
5454
);
5555

5656
let create_stored_procedure_response = stored_procedure_client
57-
.create_stored_procedure()
58-
.execute(function_body)
57+
.create_stored_procedure(function_body)
58+
.into_future()
5959
.await?;
6060
println!(
6161
"create_stored_procedure_response == {:#?}",

sdk/data_cosmos/examples/user_00.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
use azure_core::Context;
21
use azure_data_cosmos::prelude::*;
32
use futures::StreamExt;
43
use std::error::Error;
@@ -47,7 +46,8 @@ async fn main() -> Result<(), Box<dyn Error + Send + Sync>> {
4746
let new_user = format!("{}replaced", user_name);
4847

4948
let replace_user_response = user_client
50-
.replace_user(Context::new(), &new_user, ReplaceUserOptions::new())
49+
.replace_user(new_user.clone())
50+
.into_future()
5151
.await?;
5252
println!("replace_user_response == {:#?}", replace_user_response);
5353

sdk/data_cosmos/src/clients/permission_client.rs

Lines changed: 4 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
use super::*;
22
use crate::prelude::*;
3-
use crate::resources::permission::{PermissionMode, PermissionResponse};
4-
use crate::resources::ResourceType;
3+
use crate::resources::permission::PermissionMode;
54
use crate::ReadonlyString;
6-
use azure_core::{Context, Pipeline, Request};
5+
use azure_core::{Pipeline, Request};
76

87
/// A client for Cosmos permission resources.
98
#[derive(Debug, Clone)]
@@ -49,22 +48,8 @@ impl PermissionClient {
4948
}
5049

5150
/// Replace the permission
52-
pub async fn replace_permission(
53-
&self,
54-
ctx: Context,
55-
options: ReplacePermissionOptions,
56-
permission_mode: &PermissionMode,
57-
) -> crate::Result<PermissionResponse> {
58-
let mut request = self.prepare_request_with_permission_name(http::Method::PUT);
59-
60-
options.decorate_request(&mut request, self.permission_name(), permission_mode)?;
61-
62-
let response = self
63-
.pipeline()
64-
.send(ctx.clone().insert(ResourceType::Permissions), &mut request)
65-
.await?;
66-
67-
Ok(PermissionResponse::try_from(response).await?)
51+
pub fn replace_permission(&self, permission_mode: PermissionMode) -> ReplacePermissionBuilder {
52+
ReplacePermissionBuilder::new(self.clone(), permission_mode)
6853
}
6954

7055
/// Get the permission

sdk/data_cosmos/src/clients/stored_procedure_client.rs

Lines changed: 36 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
use super::*;
2+
use crate::prelude::*;
23
use crate::resources::ResourceType;
34
use crate::{requests, ReadonlyString};
4-
use azure_core::HttpClient;
5+
use azure_core::{HttpClient, Pipeline, Request};
56

67
/// A client for Cosmos stored procedure resources.
78
#[derive(Debug, Clone)]
@@ -42,13 +43,19 @@ impl StoredProcedureClient {
4243
}
4344

4445
/// Create the stored procedure
45-
pub fn create_stored_procedure(&self) -> requests::CreateStoredProcedureBuilder<'_, '_> {
46-
requests::CreateStoredProcedureBuilder::new(self)
46+
pub fn create_stored_procedure<S: Into<String>>(
47+
&self,
48+
function_body: S,
49+
) -> CreateStoredProcedureBuilder {
50+
CreateStoredProcedureBuilder::new(self.clone(), function_body.into())
4751
}
4852

4953
/// Replace the stored procedure
50-
pub fn replace_stored_procedure(&self) -> requests::ReplaceStoredProcedureBuilder<'_, '_> {
51-
requests::ReplaceStoredProcedureBuilder::new(self)
54+
pub fn replace_stored_procedure<S: Into<String>>(
55+
&self,
56+
function_body: S,
57+
) -> ReplaceStoredProcedureBuilder {
58+
ReplaceStoredProcedureBuilder::new(self.clone(), function_body.into())
5259
}
5360

5461
/// Execute the stored procedure
@@ -61,34 +68,52 @@ impl StoredProcedureClient {
6168
requests::DeleteStoredProcedureBuilder::new(self)
6269
}
6370

64-
pub(crate) fn prepare_request(&self, method: http::Method) -> http::request::Builder {
71+
pub(crate) fn prepare_request_with_stored_procedure_name(
72+
&self,
73+
method: http::Method,
74+
) -> http::request::Builder {
6575
self.cosmos_client().prepare_request(
6676
&format!(
67-
"dbs/{}/colls/{}/sprocs",
77+
"dbs/{}/colls/{}/sprocs/{}",
6878
self.database_client().database_name(),
6979
self.collection_client().collection_name(),
80+
self.stored_procedure_name()
7081
),
7182
method,
7283
ResourceType::StoredProcedures,
7384
)
7485
}
7586

76-
pub(crate) fn prepare_request_with_stored_procedure_name(
87+
pub(crate) fn prepare_pipeline_with_stored_procedure_name(
7788
&self,
7889
method: http::Method,
79-
) -> http::request::Builder {
80-
self.cosmos_client().prepare_request(
90+
) -> Request {
91+
self.cosmos_client().prepare_request_pipeline(
8192
&format!(
8293
"dbs/{}/colls/{}/sprocs/{}",
8394
self.database_client().database_name(),
8495
self.collection_client().collection_name(),
8596
self.stored_procedure_name()
8697
),
8798
method,
88-
ResourceType::StoredProcedures,
8999
)
90100
}
91101

102+
pub(crate) fn prepare_request_pipeline(&self, method: http::Method) -> Request {
103+
self.cosmos_client().prepare_request_pipeline(
104+
&format!(
105+
"dbs/{}/colls/{}/sprocs",
106+
self.database_client().database_name(),
107+
self.collection_client().collection_name(),
108+
),
109+
method,
110+
)
111+
}
112+
113+
pub(crate) fn pipeline(&self) -> &Pipeline {
114+
self.cosmos_client().pipeline()
115+
}
116+
92117
pub(crate) fn http_client(&self) -> &dyn HttpClient {
93118
self.cosmos_client().http_client()
94119
}

sdk/data_cosmos/src/clients/user_client.rs

Lines changed: 3 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
use super::*;
22
use crate::prelude::*;
3-
use crate::resources::user::UserResponse;
4-
use crate::resources::ResourceType;
53
use crate::{requests, ReadonlyString};
6-
use azure_core::{Context, HttpClient, Pipeline, Request};
4+
use azure_core::{HttpClient, Pipeline, Request};
75

86
/// A client for Cosmos user resources.
97
#[derive(Debug, Clone)]
@@ -49,21 +47,8 @@ impl UserClient {
4947
}
5048

5149
/// Replace the user
52-
pub async fn replace_user<S: AsRef<str>>(
53-
&self,
54-
ctx: Context,
55-
user_name: S,
56-
options: ReplaceUserOptions,
57-
) -> crate::Result<UserResponse> {
58-
let mut request = self.prepare_request_with_user_name(http::Method::PUT);
59-
60-
options.decorate_request(&mut request, user_name.as_ref())?;
61-
let response = self
62-
.pipeline()
63-
.send(ctx.clone().insert(ResourceType::Users), &mut request)
64-
.await?;
65-
66-
Ok(UserResponse::try_from(response).await?)
50+
pub fn replace_user<S: Into<String>>(&self, user_name: S) -> ReplaceUserBuilder {
51+
ReplaceUserBuilder::new(self.clone(), user_name.into())
6752
}
6853

6954
/// Delete the user
Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
use crate::headers::from_headers::*;
2+
use crate::prelude::*;
3+
use crate::resources::StoredProcedure;
4+
use crate::ResourceQuota;
5+
use azure_core::headers::{etag_from_headers, session_token_from_headers};
6+
use azure_core::{collect_pinned_stream, Context, Response as HttpResponse};
7+
use chrono::{DateTime, Utc};
8+
9+
#[derive(Debug, Clone)]
10+
pub struct CreateStoredProcedureBuilder {
11+
client: StoredProcedureClient,
12+
function_body: String,
13+
consistency_level: Option<ConsistencyLevel>,
14+
context: Context,
15+
}
16+
17+
impl CreateStoredProcedureBuilder {
18+
pub(crate) fn new(client: StoredProcedureClient, body: String) -> Self {
19+
Self {
20+
client,
21+
function_body: body,
22+
consistency_level: None,
23+
context: Context::new(),
24+
}
25+
}
26+
27+
setters! {
28+
consistency_level: ConsistencyLevel => Some(consistency_level),
29+
context: Context => context,
30+
}
31+
32+
pub fn into_future(self) -> CreateStoredProcedure {
33+
Box::pin(async move {
34+
let mut req = self.client.prepare_request_pipeline(http::Method::POST);
35+
36+
azure_core::headers::add_optional_header2(&self.consistency_level, &mut req)?;
37+
38+
#[derive(Debug, Serialize)]
39+
struct Request<'a> {
40+
body: &'a str,
41+
id: &'a str,
42+
}
43+
let body = Request {
44+
body: &self.function_body,
45+
id: self.client.stored_procedure_name(),
46+
};
47+
48+
req.set_body(bytes::Bytes::from(serde_json::to_string(&body)?).into());
49+
50+
let response = self
51+
.client
52+
.pipeline()
53+
.send(
54+
self.context.clone().insert(ResourceType::StoredProcedures),
55+
&mut req,
56+
)
57+
.await?;
58+
CreateStoredProcedureResponse::try_from(response).await
59+
})
60+
}
61+
}
62+
63+
#[cfg(feature = "into_future")]
64+
impl std::future::IntoFuture for CreateStoredProcedureBuilder {
65+
type Future = CreateStoredProcedure;
66+
type Output = <CreateStoredProcedure as std::future::Future>::Output;
67+
fn into_future(self) -> Self::Future {
68+
Self::into_future(self)
69+
}
70+
}
71+
72+
/// The future returned by calling `into_future` on the builder.
73+
pub type CreateStoredProcedure =
74+
futures::future::BoxFuture<'static, crate::Result<CreateStoredProcedureResponse>>;
75+
76+
/// A stored procedure response
77+
#[derive(Debug, Clone, PartialEq)]
78+
pub struct CreateStoredProcedureResponse {
79+
pub stored_procedure: StoredProcedure,
80+
pub charge: f64,
81+
pub activity_id: uuid::Uuid,
82+
pub etag: String,
83+
pub session_token: String,
84+
pub last_change: DateTime<Utc>,
85+
pub resource_quota: Vec<ResourceQuota>,
86+
pub resource_usage: Vec<ResourceQuota>,
87+
pub quorum_acked_lsn: u64,
88+
pub current_write_quorum: u64,
89+
pub current_replica_set_size: u64,
90+
}
91+
92+
impl CreateStoredProcedureResponse {
93+
pub async fn try_from(response: HttpResponse) -> crate::Result<Self> {
94+
let (_status_code, headers, pinned_stream) = response.deconstruct();
95+
let body = collect_pinned_stream(pinned_stream).await?;
96+
97+
Ok(Self {
98+
stored_procedure: serde_json::from_slice(&body)?,
99+
charge: request_charge_from_headers(&headers)?,
100+
activity_id: activity_id_from_headers(&headers)?,
101+
etag: etag_from_headers(&headers)?,
102+
session_token: session_token_from_headers(&headers)?,
103+
last_change: last_state_change_from_headers(&headers)?,
104+
resource_quota: resource_quota_from_headers(&headers)?,
105+
resource_usage: resource_usage_from_headers(&headers)?,
106+
quorum_acked_lsn: quorum_acked_lsn_from_headers(&headers)?,
107+
current_write_quorum: current_write_quorum_from_headers(&headers)?,
108+
current_replica_set_size: current_replica_set_size_from_headers(&headers)?,
109+
})
110+
}
111+
}

sdk/data_cosmos/src/operations/mod.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ mod create_collection;
66
mod create_database;
77
mod create_document;
88
mod create_permission;
9+
mod create_stored_procedure;
910
mod create_user;
1011
mod delete_collection;
1112
mod delete_database;
@@ -23,12 +24,14 @@ mod list_users;
2324
mod replace_collection;
2425
mod replace_document;
2526
mod replace_permission;
27+
mod replace_stored_procedure;
2628
mod replace_user;
2729

2830
pub use create_collection::*;
2931
pub use create_database::*;
3032
pub use create_document::*;
3133
pub use create_permission::*;
34+
pub use create_stored_procedure::*;
3235
pub use create_user::*;
3336
pub use delete_collection::*;
3437
pub use delete_database::*;
@@ -46,4 +49,5 @@ pub use list_users::*;
4649
pub use replace_collection::*;
4750
pub use replace_document::*;
4851
pub use replace_permission::*;
52+
pub use replace_stored_procedure::*;
4953
pub use replace_user::*;

0 commit comments

Comments
 (0)