Skip to content

Commit a4a9480

Browse files
authored
Add IntoFuture impls for the last operations in Cosmos (#846)
1 parent 27725f9 commit a4a9480

File tree

10 files changed

+53
-28
lines changed

10 files changed

+53
-28
lines changed

sdk/core/src/macros.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ macro_rules! setters {
2929
#[allow(clippy::redundant_field_names)]
3030
#[allow(clippy::needless_update)]
3131
// TODO: Declare using idiomatic with_$name when https://github.com/Azure/azure-sdk-for-rust/issues/292 is resolved.
32-
pub fn $name<T: ::std::convert::Into<$typ>>(self, $name: T) -> Self {
32+
pub fn $name<_T: ::std::convert::Into<$typ>>(self, $name: _T) -> Self {
3333
let $name: $typ = $name.into();
3434
Self {
3535
$name: $transform,

sdk/data_cosmos/examples/document_00.rs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
use futures::stream::StreamExt;
22
use serde::{Deserialize, Serialize};
3-
// Using the prelude module of the Cosmos crate makes easier to use the Rust Azure SDK for Cosmos
4-
// DB.
3+
// Using the prelude module of the Cosmos crate makes easier to use the Rust Azure SDK for Cosmos DB.
54
use azure_core::prelude::*;
65

76
use azure_data_cosmos::prelude::*;
@@ -159,8 +158,8 @@ async fn main() -> azure_core::Result<()> {
159158
let get_document_response = collection
160159
.clone()
161160
.document_client(doc.id.clone(), &doc.id)?
162-
.get_document()
163-
.into_future::<MySampleStruct>()
161+
.get_document::<MySampleStruct>()
162+
.into_future()
164163
.await?;
165164
println!("get_document_response == {:#?}", get_document_response);
166165

sdk/data_cosmos/examples/document_entries_01.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -60,17 +60,17 @@ async fn main() -> azure_core::Result<()> {
6060

6161
let get_document_response = client
6262
.document_client(doc.id.clone(), &doc.id)?
63-
.get_document()
63+
.get_document::<serde_json::Value>()
6464
.consistency_level(&create_document_response)
65-
.into_future::<serde_json::Value>()
65+
.into_future()
6666
.await?;
6767
println!("get_document_response == {:#?}", get_document_response);
6868

6969
let get_document_response = client
7070
.document_client("ciccia", &doc.id)?
71-
.get_document()
71+
.get_document::<serde_json::Value>()
7272
.consistency_level(&create_document_response)
73-
.into_future::<serde_json::Value>()
73+
.into_future()
7474
.await?;
7575
println!(
7676
"get_document_response == {:#?}\n\n\n",

sdk/data_cosmos/examples/stored_proc_00.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,9 @@ async fn main() -> azure_core::Result<()> {
3232
.database_client(database)
3333
.collection_client(collection)
3434
.stored_procedure_client("test_proc")
35-
.execute_stored_procedure()
35+
.execute_stored_procedure::<serde_json::Value>()
3636
.parameters(["Robert"])
37-
.into_future::<serde_json::Value>()
37+
.into_future()
3838
.await?;
3939

4040
println!("Response object:\n{:#?}", ret);

sdk/data_cosmos/examples/stored_proc_01.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,9 +65,9 @@ async fn main() -> azure_core::Result<()> {
6565
);
6666

6767
let execute_stored_procedure_response = stored_procedure
68-
.execute_stored_procedure()
68+
.execute_stored_procedure::<serde_json::Value>()
6969
.parameters(["Robert"])
70-
.into_future::<serde_json::Value>()
70+
.into_future()
7171
.await?;
7272

7373
println!(

sdk/data_cosmos/src/clients/document.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ use crate::clients::*;
22
use crate::operations::*;
33
use crate::ReadonlyString;
44
use azure_core::Request;
5+
use serde::de::DeserializeOwned;
56
use serde::Serialize;
67

78
/// A client for Cosmos document resources.
@@ -29,7 +30,7 @@ impl DocumentClient {
2930
}
3031

3132
/// Get the document.
32-
pub fn get_document(&self) -> GetDocumentBuilder {
33+
pub fn get_document<T: DeserializeOwned + Send>(&self) -> GetDocumentBuilder<T> {
3334
GetDocumentBuilder::new(self.clone())
3435
}
3536

sdk/data_cosmos/src/clients/stored_procedure.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ use crate::clients::*;
22
use crate::prelude::*;
33
use crate::ReadonlyString;
44
use azure_core::{Pipeline, Request};
5+
use serde::de::DeserializeOwned;
56

67
/// A client for Cosmos stored procedure resources.
78
#[derive(Debug, Clone)]
@@ -38,7 +39,9 @@ impl StoredProcedureClient {
3839
}
3940

4041
/// Execute the stored procedure.
41-
pub fn execute_stored_procedure(&self) -> ExecuteStoredProcedureBuilder {
42+
pub fn execute_stored_procedure<T: DeserializeOwned + Send>(
43+
&self,
44+
) -> ExecuteStoredProcedureBuilder<T> {
4245
ExecuteStoredProcedureBuilder::new(self.clone())
4346
}
4447

sdk/data_cosmos/src/operations/execute_stored_procedure.rs

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
use std::marker::PhantomData;
2+
13
use crate::headers::from_headers::*;
24
use crate::prelude::*;
35
use crate::resources::stored_procedure::Parameters;
@@ -10,18 +12,19 @@ use chrono::{DateTime, Utc};
1012
use serde::de::DeserializeOwned;
1113

1214
#[derive(Debug, Clone)]
13-
pub struct ExecuteStoredProcedureBuilder {
15+
pub struct ExecuteStoredProcedureBuilder<T> {
1416
client: StoredProcedureClient,
1517
parameters: Option<Parameters>,
1618
consistency_level: Option<ConsistencyLevel>,
1719
allow_tentative_writes: TentativeWritesAllowance,
1820
partition_key: Option<String>,
1921
context: Context,
22+
_stored_proc: PhantomData<T>,
2023
}
2124

2225
static EMPTY_LIST: &[u8; 2] = b"[]";
2326

24-
impl ExecuteStoredProcedureBuilder {
27+
impl<T: DeserializeOwned + Send> ExecuteStoredProcedureBuilder<T> {
2528
pub(crate) fn new(client: StoredProcedureClient) -> Self {
2629
Self {
2730
client,
@@ -30,6 +33,7 @@ impl ExecuteStoredProcedureBuilder {
3033
allow_tentative_writes: TentativeWritesAllowance::Deny,
3134
partition_key: None,
3235
context: Context::new(),
36+
_stored_proc: PhantomData,
3337
}
3438
}
3539

@@ -47,10 +51,7 @@ impl ExecuteStoredProcedureBuilder {
4751
})
4852
}
4953

50-
pub fn into_future<T>(self) -> ExecuteStoredProcedure<T>
51-
where
52-
T: DeserializeOwned,
53-
{
54+
pub fn into_future(self) -> ExecuteStoredProcedure<T> {
5455
Box::pin(async move {
5556
let mut request = self.client.stored_procedure_request(http::Method::POST);
5657

@@ -90,6 +91,14 @@ impl ExecuteStoredProcedureBuilder {
9091
pub type ExecuteStoredProcedure<T> =
9192
futures::future::BoxFuture<'static, azure_core::Result<ExecuteStoredProcedureResponse<T>>>;
9293

94+
#[cfg(feature = "into_future")]
95+
impl<T: DeserializeOwned + Send> std::future::IntoFuture for ExecuteStoredProcedureBuilder<T> {
96+
type IntoFuture = ExecuteStoredProcedure<T>;
97+
type Output = <ExecuteStoredProcedure<T> as std::future::Future>::Output;
98+
fn into_future(self) -> Self::IntoFuture {
99+
Self::into_future(self)
100+
}
101+
}
93102
#[derive(Debug, Clone)]
94103
pub struct ExecuteStoredProcedureResponse<T>
95104
where

sdk/data_cosmos/src/operations/get_document.rs

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
use std::marker::PhantomData;
2+
13
use crate::headers::from_headers::*;
24
use crate::prelude::*;
35
use crate::resources::Document;
@@ -10,22 +12,24 @@ use http::StatusCode;
1012
use serde::de::DeserializeOwned;
1113

1214
#[derive(Debug, Clone)]
13-
pub struct GetDocumentBuilder {
15+
pub struct GetDocumentBuilder<T> {
1416
client: DocumentClient,
1517
if_match_condition: Option<IfMatchCondition>,
1618
if_modified_since: Option<IfModifiedSince>,
1719
consistency_level: Option<ConsistencyLevel>,
1820
context: Context,
21+
_document: PhantomData<T>,
1922
}
2023

21-
impl GetDocumentBuilder {
24+
impl<T: DeserializeOwned + Send> GetDocumentBuilder<T> {
2225
pub(crate) fn new(client: DocumentClient) -> Self {
2326
Self {
2427
client,
2528
if_match_condition: None,
2629
if_modified_since: None,
2730
consistency_level: None,
2831
context: Context::new(),
32+
_document: PhantomData,
2933
}
3034
}
3135

@@ -41,7 +45,7 @@ impl GetDocumentBuilder {
4145
/// We do not implement `std::future::IntoFuture` because it requires the ability for the
4246
/// output of the future to be generic which is not possible in Rust (as of 1.59). Once
4347
/// generic associated types (GATs) stabilize, this will become possible.
44-
pub fn into_future<T: DeserializeOwned>(self) -> GetDocument<T> {
48+
pub fn into_future(self) -> GetDocument<T> {
4549
Box::pin(async move {
4650
let mut request = self.client.document_request(http::Method::GET);
4751

@@ -76,6 +80,15 @@ impl GetDocumentBuilder {
7680
pub type GetDocument<T> =
7781
futures::future::BoxFuture<'static, azure_core::Result<GetDocumentResponse<T>>>;
7882

83+
#[cfg(feature = "into_future")]
84+
impl<T: DeserializeOwned + Send> std::future::IntoFuture for GetDocumentBuilder<T> {
85+
type IntoFuture = GetDocument<T>;
86+
type Output = <GetDocument<T> as std::future::Future>::Output;
87+
fn into_future(self) -> Self::IntoFuture {
88+
Self::into_future(self)
89+
}
90+
}
91+
7992
#[derive(Debug, Clone)]
8093
// note(rylev): clippy seems to be falsely detecting that
8194
// one of the variants is much larger than the other (which

sdk/data_cosmos/tests/document_operations.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -109,8 +109,8 @@ async fn document_operations() {
109109
.unwrap();
110110

111111
let document_after_get = document
112-
.get_document()
113-
.into_future::<MyDocument>()
112+
.get_document::<MyDocument>()
113+
.into_future()
114114
.await
115115
.unwrap();
116116

@@ -142,8 +142,8 @@ async fn document_operations() {
142142
.document_client(DOCUMENT_NAME, &DOCUMENT_NAME)
143143
.unwrap();
144144
let document_after_get = document
145-
.get_document()
146-
.into_future::<MyDocument>()
145+
.get_document::<MyDocument>()
146+
.into_future()
147147
.await
148148
.unwrap();
149149

0 commit comments

Comments
 (0)