Skip to content

Commit ad4e3c9

Browse files
committed
Create ListDatabases resource
This converts from the older req/res-style API into the newer pipeline-based API (ref: #290).
1 parent 356d508 commit ad4e3c9

File tree

14 files changed

+183
-181
lines changed

14 files changed

+183
-181
lines changed

sdk/core/src/headers/mod.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,13 @@ pub fn add_mandatory_header<T: AddAsHeader>(item: &T, builder: Builder) -> Build
8383
item.add_as_header(builder)
8484
}
8585

86+
pub fn add_mandatory_header2<T: AddAsHeader>(
87+
item: &T,
88+
request: &mut crate::Request,
89+
) -> Result<(), crate::errors::HTTPHeaderError> {
90+
item.add_as_header2(request)
91+
}
92+
8693
pub const SERVER: &str = "server";
8794
pub const SOURCE_IF_MODIFIED_SINCE: &str = "x-ms-source-if-modified-since";
8895
pub const SOURCE_IF_UNMODIFIED_SINCE: &str = "x-ms-source-if-unmodified-since";

sdk/cosmos/examples/collection.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,9 @@ async fn main() -> Result<(), Box<dyn Error + Send + Sync>> {
3333
// The Cosmos' client exposes a lot of methods. This one lists the databases in the specified
3434
// account. Database do not implement Display but deref to &str so you can pass it to methods
3535
// both as struct or id.
36-
let databases = client.list_databases().execute().await?;
36+
let databases = client
37+
.list_databases(Context::new(), ListDatabasesOptions::new())
38+
.await?;
3739

3840
println!(
3941
"Account {} has {} database(s)",

sdk/cosmos/examples/create_delete_database.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,9 @@ async fn main() -> Result<(), Box<dyn Error + Send + Sync>> {
3434
// account. Database do not implement Display but deref to &str so you can pass it to methods
3535
// both as struct or id.
3636

37-
let list_databases_response = client.list_databases().execute().await?;
37+
let list_databases_response = client
38+
.list_databases(Context::new(), ListDatabasesOptions::new())
39+
.await?;
3840
println!("list_databases_response = {:#?}", list_databases_response);
3941

4042
let db = client

sdk/cosmos/examples/database_00.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
use azure_core::Context;
12
use azure_cosmos::prelude::*;
23
use serde_json::Value;
34
use std::error::Error;
@@ -14,7 +15,9 @@ async fn main() -> Result<(), Box<dyn Error + Send + Sync>> {
1415

1516
let client = CosmosClient::new(account, authorization_token, CosmosOptions::default());
1617

17-
let dbs = client.list_databases().execute().await?;
18+
let dbs = client
19+
.list_databases(Context::new(), ListDatabasesOptions::new())
20+
.await?;
1821

1922
for db in dbs.databases {
2023
println!("database == {:?}", db);

sdk/cosmos/examples/document_00.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,7 @@ async fn main() -> Result<(), Box<dyn Error + Send + Sync>> {
5858
// specific azure_cosmos::Error. In this example we will look for a specific database
5959
// so we chain a filter operation.
6060
let db = client
61-
.list_databases()
62-
.execute()
61+
.list_databases(Context::new(), ListDatabasesOptions::new())
6362
.await?
6463
.databases
6564
.into_iter()

sdk/cosmos/src/clients/cosmos_client.rs

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use crate::headers::*;
44
use crate::operations::*;
55
use crate::resources::permission::AuthorizationToken;
66
use crate::resources::ResourceType;
7-
use crate::{requests, ReadonlyString, TimeNonce};
7+
use crate::{ReadonlyString, TimeNonce};
88
use azure_core::pipeline::Pipeline;
99
use azure_core::HttpClient;
1010
use azure_core::Request;
@@ -163,8 +163,23 @@ impl CosmosClient {
163163
}
164164

165165
/// List all databases
166-
pub fn list_databases(&self) -> requests::ListDatabasesBuilder<'_> {
167-
requests::ListDatabasesBuilder::new(self)
166+
pub async fn list_databases(
167+
&self,
168+
ctx: Context,
169+
options: ListDatabasesOptions,
170+
) -> Result<ListDatabasesResponse, crate::Error> {
171+
let mut request = self.prepare_request_pipeline("dbs", http::Method::GET);
172+
let mut pipeline_context = PipelineContext::new(ctx, ResourceType::Databases.into());
173+
174+
options.decorate_request(&mut request).await?;
175+
let response = self
176+
.pipeline()
177+
.send(&mut pipeline_context, &mut request)
178+
.await?
179+
.validate(http::StatusCode::OK)
180+
.await?;
181+
182+
Ok(ListDatabasesResponse::try_from(response).await?)
168183
}
169184

170185
/// Convert into a [`DatabaseClient`]
Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
use crate::headers::from_headers::*;
2+
use crate::prelude::*;
3+
use crate::resources::Database;
4+
use crate::ResourceQuota;
5+
6+
use azure_core::headers::{continuation_token_from_headers_optional, session_token_from_headers};
7+
use azure_core::{collect_pinned_stream, prelude::*, Request, Response};
8+
use chrono::{DateTime, Utc};
9+
10+
#[derive(Debug, Clone)]
11+
pub struct ListDatabasesOptions {
12+
consistency_level: Option<ConsistencyLevel>,
13+
max_item_count: MaxItemCount,
14+
}
15+
16+
impl ListDatabasesOptions {
17+
pub fn new() -> Self {
18+
Self {
19+
consistency_level: None,
20+
max_item_count: MaxItemCount::new(-1),
21+
}
22+
}
23+
24+
setters! {
25+
consistency_level: ConsistencyLevel => Some(consistency_level),
26+
max_item_count: i32 => MaxItemCount::new(max_item_count),
27+
}
28+
29+
pub async fn decorate_request(&self, request: &mut Request) -> Result<(), crate::Error> {
30+
azure_core::headers::add_optional_header2(&self.consistency_level, request)?;
31+
azure_core::headers::add_mandatory_header2(&self.max_item_count, request)?;
32+
Ok(())
33+
}
34+
35+
// pub fn stream(&self) -> impl Stream<Item = Result<ListDatabasesResponse, crate::Error>> + '_ {
36+
// #[derive(Debug, Clone, PartialEq)]
37+
// enum States {
38+
// Init,
39+
// Continuation(String),
40+
// }
41+
42+
// unfold(
43+
// Some(States::Init),
44+
// move |continuation_token: Option<States>| {
45+
// async move {
46+
// debug!("continuation_token == {:?}", &continuation_token);
47+
// let response = match continuation_token {
48+
// Some(States::Init) => self.decorate_request().await,
49+
// Some(States::Continuation(continuation_token)) => {
50+
// self.clone()
51+
// .continuation(continuation_token.as_str())
52+
// .decorate_request()
53+
// .await
54+
// }
55+
// None => return None,
56+
// };
57+
58+
// // the ? operator does not work in async move (yet?)
59+
// // so we have to resort to this boilerplate
60+
// let response = match response {
61+
// Ok(response) => response,
62+
// Err(err) => return Some((Err(err), None)),
63+
// };
64+
65+
// let continuation_token = response
66+
// .continuation_token
67+
// .as_ref()
68+
// .map(|ct| States::Continuation(ct.to_owned()));
69+
70+
// Some((Ok(response), continuation_token))
71+
// }
72+
// },
73+
// )
74+
// }
75+
}
76+
77+
#[derive(Clone, PartialEq, PartialOrd, Debug)]
78+
pub struct ListDatabasesResponse {
79+
pub rid: String,
80+
pub databases: Vec<Database>,
81+
pub count: u32,
82+
pub activity_id: uuid::Uuid,
83+
pub charge: f64,
84+
pub session_token: String,
85+
pub last_state_change: DateTime<Utc>,
86+
pub resource_quota: Vec<ResourceQuota>,
87+
pub resource_usage: Vec<ResourceQuota>,
88+
pub schema_version: String,
89+
pub service_version: String,
90+
pub continuation_token: Option<String>,
91+
pub gateway_version: String,
92+
}
93+
94+
impl ListDatabasesResponse {
95+
pub(crate) async fn try_from(response: Response) -> Result<Self, crate::Error> {
96+
let (_status_code, headers, pinned_stream) = response.deconstruct();
97+
let body = collect_pinned_stream(pinned_stream).await?;
98+
99+
#[derive(Deserialize, Debug)]
100+
pub struct Response {
101+
#[serde(rename = "_rid")]
102+
rid: String,
103+
#[serde(rename = "Databases")]
104+
pub databases: Vec<Database>,
105+
#[serde(rename = "_count")]
106+
pub count: u32,
107+
}
108+
109+
let response: Response = serde_json::from_slice(&body)?;
110+
111+
Ok(Self {
112+
rid: response.rid,
113+
databases: response.databases,
114+
count: response.count,
115+
charge: request_charge_from_headers(&headers)?,
116+
activity_id: activity_id_from_headers(&headers)?,
117+
session_token: session_token_from_headers(&headers)?,
118+
last_state_change: last_state_change_from_headers(&headers)?,
119+
resource_quota: resource_quota_from_headers(&headers)?,
120+
resource_usage: resource_usage_from_headers(&headers)?,
121+
schema_version: schema_version_from_headers(&headers)?.to_owned(),
122+
service_version: service_version_from_headers(&headers)?.to_owned(),
123+
continuation_token: continuation_token_from_headers_optional(&headers)?,
124+
gateway_version: gateway_version_from_headers(&headers)?.to_owned(),
125+
})
126+
}
127+
}

sdk/cosmos/src/operations/mod.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,13 @@ mod create_database;
77
mod create_user;
88
mod get_database;
99
mod get_user;
10+
mod list_databases;
1011
mod replace_user;
1112

1213
pub use create_collection::*;
1314
pub use create_database::*;
1415
pub use create_user::*;
1516
pub use get_database::*;
1617
pub use get_user::*;
18+
pub use list_databases::*;
1719
pub use replace_user::*;

sdk/cosmos/src/requests/list_databases_builder.rs

Lines changed: 0 additions & 102 deletions
This file was deleted.

sdk/cosmos/src/requests/mod.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@ mod get_partition_key_ranges_builder;
3030
mod get_permission_builer;
3131
mod list_attachments_builder;
3232
mod list_collections_builder;
33-
mod list_databases_builder;
3433
mod list_documents_builder;
3534
mod list_permissions_builder;
3635
mod list_stored_procedures_builder;
@@ -69,7 +68,6 @@ pub use get_partition_key_ranges_builder::GetPartitionKeyRangesBuilder;
6968
pub use get_permission_builer::GetPermissionBuilder;
7069
pub use list_attachments_builder::ListAttachmentsBuilder;
7170
pub use list_collections_builder::ListCollectionsBuilder;
72-
pub use list_databases_builder::ListDatabasesBuilder;
7371
pub use list_documents_builder::ListDocumentsBuilder;
7472
pub use list_permissions_builder::ListPermissionsBuilder;
7573
pub use list_stored_procedures_builder::ListStoredProceduresBuilder;

0 commit comments

Comments
 (0)