Skip to content

Commit e454b62

Browse files
committed
CreateCollectionBuilder::into_future
1 parent 535747f commit e454b62

File tree

4 files changed

+63
-47
lines changed

4 files changed

+63
-47
lines changed

sdk/data_cosmos/examples/create_delete_database.rs

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -46,13 +46,9 @@ async fn main() -> Result<(), Box<dyn Error + Send + Sync>> {
4646
// create collection!
4747
{
4848
let db_client = client.clone().into_database_client(database_name.clone());
49-
5049
let create_collection_response = db_client
51-
.create_collection(
52-
Context::new(),
53-
"panzadoro",
54-
CreateCollectionOptions::new("/id"),
55-
)
50+
.create_collection("panzadoro", "/id")
51+
.into_future()
5652
.await?;
5753

5854
println!(

sdk/data_cosmos/examples/document_00.rs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -102,11 +102,8 @@ async fn main() -> Result<(), Box<dyn Error + Send + Sync>> {
102102
client
103103
.clone()
104104
.into_database_client(database.id.clone())
105-
.create_collection(
106-
Context::new(),
107-
COLLECTION,
108-
CreateCollectionOptions::new("/id"),
109-
)
105+
.create_collection(COLLECTION, "/id")
106+
.into_future()
110107
.await?
111108
.collection
112109
}

sdk/data_cosmos/src/clients/database_client.rs

Lines changed: 6 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use super::*;
22
use crate::operations::*;
3+
use crate::resources::collection::PartitionKey;
34
use crate::resources::ResourceType;
45
use crate::ReadonlyString;
56
use azure_core::prelude::Continuation;
@@ -154,24 +155,12 @@ impl DatabaseClient {
154155
}
155156

156157
/// Create a collection
157-
pub async fn create_collection<S: AsRef<str>>(
158+
pub fn create_collection<S: Into<String>, P: Into<PartitionKey>>(
158159
&self,
159-
ctx: Context,
160160
collection_name: S,
161-
options: CreateCollectionOptions,
162-
) -> crate::Result<CreateCollectionResponse> {
163-
let mut request = self.cosmos_client().prepare_request_pipeline(
164-
&format!("dbs/{}/colls", self.database_name()),
165-
http::Method::POST,
166-
);
167-
168-
options.decorate_request(&mut request, collection_name.as_ref())?;
169-
let response = self
170-
.pipeline()
171-
.send(ctx.clone().insert(ResourceType::Collections), &mut request)
172-
.await?;
173-
174-
Ok(CreateCollectionResponse::try_from(response).await?)
161+
partition_key: P,
162+
) -> CreateCollectionBuilder {
163+
CreateCollectionBuilder::new(self.clone(), collection_name.into(), partition_key.into())
175164
}
176165

177166
/// List users
@@ -245,7 +234,7 @@ impl DatabaseClient {
245234
UserClient::new(self, user_name)
246235
}
247236

248-
fn pipeline(&self) -> &Pipeline {
237+
pub(crate) fn pipeline(&self) -> &Pipeline {
249238
self.cosmos_client.pipeline()
250239
}
251240
}

sdk/data_cosmos/src/operations/create_collection.rs

Lines changed: 53 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2,24 +2,34 @@ use crate::headers::from_headers::*;
22
use crate::prelude::*;
33
use crate::resources::collection::{IndexingPolicy, PartitionKey};
44
use azure_core::headers::{etag_from_headers, session_token_from_headers};
5-
use azure_core::{collect_pinned_stream, Request as HttpRequest, Response as HttpResponse};
5+
use azure_core::{collect_pinned_stream, Context, Response as HttpResponse};
66
use chrono::{DateTime, Utc};
77

88
#[derive(Debug, Clone)]
9-
pub struct CreateCollectionOptions {
9+
pub struct CreateCollectionBuilder {
10+
client: DatabaseClient,
1011
partition_key: PartitionKey,
1112
consistency_level: Option<ConsistencyLevel>,
1213
indexing_policy: Option<IndexingPolicy>,
14+
collection_name: String,
1315
offer: Option<Offer>,
16+
context: Context,
1417
}
1518

16-
impl CreateCollectionOptions {
17-
pub fn new<P: Into<PartitionKey>>(partition_key: P) -> Self {
19+
impl CreateCollectionBuilder {
20+
pub(crate) fn new(
21+
client: DatabaseClient,
22+
collection_name: String,
23+
partition_key: PartitionKey,
24+
) -> Self {
1825
Self {
19-
partition_key: partition_key.into(),
26+
client,
27+
collection_name,
28+
partition_key,
2029
consistency_level: None,
2130
indexing_policy: None,
2231
offer: None,
32+
context: Context::new(),
2333
}
2434
}
2535

@@ -29,25 +39,49 @@ impl CreateCollectionOptions {
2939
offer: Offer => Some(offer),
3040
}
3141

32-
pub(crate) fn decorate_request(
33-
&self,
34-
request: &mut HttpRequest,
35-
collection_name: &str,
36-
) -> crate::Result<()> {
37-
azure_core::headers::add_optional_header2(&self.offer, request)?;
38-
azure_core::headers::add_optional_header2(&self.consistency_level, request)?;
42+
pub fn into_future(self) -> CreateCollection {
43+
Box::pin(async move {
44+
let mut request = self.client.cosmos_client().prepare_request_pipeline(
45+
&format!("dbs/{}/colls", self.client.database_name()),
46+
http::Method::POST,
47+
);
48+
azure_core::headers::add_optional_header2(&self.offer, &mut request)?;
49+
azure_core::headers::add_optional_header2(&self.consistency_level, &mut request)?;
3950

40-
let collection = CreateCollectionBody {
41-
id: collection_name,
42-
indexing_policy: &self.indexing_policy,
43-
partition_key: &self.partition_key,
44-
};
51+
let collection = CreateCollectionBody {
52+
id: &self.collection_name,
53+
indexing_policy: &self.indexing_policy,
54+
partition_key: &self.partition_key,
55+
};
4556

46-
request.set_body(bytes::Bytes::from(serde_json::to_string(&collection)?).into());
47-
Ok(())
57+
request.set_body(bytes::Bytes::from(serde_json::to_string(&collection)?).into());
58+
59+
let response = self
60+
.client
61+
.pipeline()
62+
.send(
63+
self.context.clone().insert(ResourceType::Collections),
64+
&mut request,
65+
)
66+
.await?;
67+
68+
Ok(CreateCollectionResponse::try_from(response).await?)
69+
})
4870
}
4971
}
5072

73+
#[cfg(feature = "into_future")]
74+
impl std::future::IntoFuture for CreateCollectionBuilder {
75+
type Future = CreateCollection;
76+
type Output = <CreateCollection as std::future::Future>::Output;
77+
fn into_future(self) -> Self::Future {
78+
Self::into_future(self)
79+
}
80+
}
81+
82+
type CreateCollection =
83+
futures::future::BoxFuture<'static, crate::Result<CreateCollectionResponse>>;
84+
5185
/// Body for the create collection request
5286
#[derive(Serialize, Debug)]
5387
struct CreateCollectionBody<'a> {

0 commit comments

Comments
 (0)