diff --git a/sdk/storage/examples/data_lake_00.rs b/sdk/storage/examples/data_lake_00.rs index 0693e3241b..6c29878481 100644 --- a/sdk/storage/examples/data_lake_00.rs +++ b/sdk/storage/examples/data_lake_00.rs @@ -32,11 +32,17 @@ async fn main() -> Result<(), Box> { println!("token expires on {}", bearer_token.expires_on); println!(); - let data_lake = storage_account_client - .as_storage_client() - .as_data_lake_client(account, bearer_token.token.secret().to_owned())?; + let storage_client = storage_account_client.as_storage_client(); + let data_lake = DataLakeClient::new( + storage_client, + account, + bearer_token.token.secret().to_owned(), + None, + ); - let file_system = data_lake.as_file_system_client(&file_system_name)?; + let file_system = data_lake + .clone() + .into_file_system_client(file_system_name.to_string()); let mut fs_properties = Properties::new(); fs_properties.insert("AddedVia", "Azure SDK for Rust"); diff --git a/sdk/storage/src/data_lake/clients/data_lake_client.rs b/sdk/storage/src/data_lake/clients/data_lake_client.rs index 560edfc217..0644cfa901 100644 --- a/sdk/storage/src/data_lake/clients/data_lake_client.rs +++ b/sdk/storage/src/data_lake/clients/data_lake_client.rs @@ -1,6 +1,7 @@ use crate::core::prelude::*; use crate::data_lake::authorization_policy::AuthorizationPolicy; use crate::data_lake::authorization_policy::DataLakeContext; +use crate::data_lake::clients::FileSystemClient; use crate::data_lake::requests::*; use azure_core::pipeline::Pipeline; use azure_core::prelude::*; @@ -9,83 +10,16 @@ use bytes::Bytes; use http::method::Method; use http::request::{Builder, Request}; use std::sync::Arc; -use url::{ParseError, Url}; const DEFAULT_DNS_SUFFIX: &str = "dfs.core.windows.net"; -pub trait AsDataLakeClient> { - fn as_data_lake_client( - &self, - account: A, - bearer_token: String, - ) -> Result, url::ParseError>; - - #[cfg(feature = "mock_transport_framework")] - fn as_data_lake_client_with_transaction( - &self, - account: A, - bearer_token: String, - transaction_name: impl Into, - ) -> Result, url::ParseError>; -} - -pub trait AsCustomDataLakeClient, A: Into> { - fn as_data_lake_client_with_custom_dns_suffix( - &self, - account: A, - bearer_token: String, - dns_suffix: DS, - ) -> Result, url::ParseError>; -} - -impl> AsDataLakeClient for Arc { - fn as_data_lake_client( - &self, - account: A, - bearer_token: String, - ) -> Result, url::ParseError> { - DataLakeClient::new(self.clone(), account.into(), bearer_token, None) - } - - #[cfg(feature = "mock_transport_framework")] - fn as_data_lake_client_with_transaction( - &self, - account: A, - bearer_token: String, - transaction_name: impl Into, - ) -> Result, url::ParseError> { - DataLakeClient::new_with_transaction( - self.clone(), - account.into(), - bearer_token, - transaction_name, - ) - } -} - -impl, A: Into> AsCustomDataLakeClient for Arc { - fn as_data_lake_client_with_custom_dns_suffix( - &self, - account: A, - bearer_token: String, - dns_suffix: DS, - ) -> Result, url::ParseError> { - DataLakeClient::new( - self.clone(), - account.into(), - bearer_token, - Some(dns_suffix.into()), - ) - } -} - #[derive(Debug, Clone)] pub struct DataLakeClient { pipeline: Pipeline, storage_client: Arc, account: String, custom_dns_suffix: Option, - url: Url, // TODO: Use CloudLocation similar to CosmosClient + url: String, // TODO: Use CloudLocation similar to CosmosClient } impl DataLakeClient { @@ -95,20 +29,17 @@ impl DataLakeClient { bearer_token: String, custom_dns_suffix: Option, options: ClientOptions, - ) -> Result, url::ParseError> { + ) -> Self { // we precalculate the url once in the constructor // so we do not have to do it at every request. - // This means we have to account for possible - // malfolmed urls in the constructor, hence - // the Result<_, url::ParseError>. - let url = url::Url::parse(&format!( + let url = format!( "https://{}.{}", account, match custom_dns_suffix.as_ref() { Some(custom_dns_suffix) => custom_dns_suffix, None => DEFAULT_DNS_SUFFIX, } - ))?; + ); let per_call_policies = Vec::new(); let auth_policy: Arc> = @@ -127,13 +58,13 @@ impl DataLakeClient { per_retry_policies, ); - Ok(Arc::new(Self { + Self { pipeline, storage_client, account, custom_dns_suffix, url, - })) + } } pub fn new( @@ -141,7 +72,7 @@ impl DataLakeClient { account: String, bearer_token: String, custom_dns_suffix: Option, - ) -> Result, ParseError> { + ) -> DataLakeClient { Self::new_with_options( storage_client, account, @@ -157,7 +88,7 @@ impl DataLakeClient { account: String, bearer_token: String, transaction_name: impl Into, - ) -> Result, ParseError> { + ) -> DataLakeClient { Self::new_with_options( storage_client, account, @@ -175,7 +106,7 @@ impl DataLakeClient { self.storage_client.storage_account_client().http_client() } - pub(crate) fn url(&self) -> &Url { + pub(crate) fn url(&self) -> &str { &self.url } @@ -183,6 +114,10 @@ impl DataLakeClient { ListFileSystemsBuilder::new(self) } + pub fn into_file_system_client(self, file_system_name: String) -> FileSystemClient { + FileSystemClient::new(self, file_system_name) + } + pub(crate) fn prepare_request( &self, url: &str, diff --git a/sdk/storage/src/data_lake/clients/file_system_client.rs b/sdk/storage/src/data_lake/clients/file_system_client.rs index 28944c1a84..028fa6161a 100644 --- a/sdk/storage/src/data_lake/clients/file_system_client.rs +++ b/sdk/storage/src/data_lake/clients/file_system_client.rs @@ -6,41 +6,29 @@ use azure_core::pipeline::Pipeline; use azure_core::{Context, HttpClient, PipelineContext}; use bytes::Bytes; -use std::sync::Arc; use url::Url; -pub trait AsFileSystemClient> { - fn as_file_system_client(&self, name: A) -> Result, url::ParseError>; -} - -impl> AsFileSystemClient for Arc { - fn as_file_system_client(&self, name: A) -> Result, url::ParseError> { - FileSystemClient::new(self.clone(), name.into()) - } -} - #[derive(Debug, Clone)] pub struct FileSystemClient { - data_lake_client: Arc, + data_lake_client: DataLakeClient, name: String, url: Url, } impl FileSystemClient { - pub(crate) fn new( - data_lake_client: Arc, - name: String, - ) -> Result, url::ParseError> { - let mut url = data_lake_client.url().to_owned(); + pub(crate) fn new(data_lake_client: DataLakeClient, name: String) -> Self { + let mut url = url::Url::parse(data_lake_client.url()).unwrap(); + url.path_segments_mut() - .map_err(|_| url::ParseError::SetHostOnCannotBeABaseUrl)? + .map_err(|_| url::ParseError::SetHostOnCannotBeABaseUrl) + .unwrap() .push(&name); - Ok(Arc::new(Self { + Self { data_lake_client, name, url, - })) + } } pub fn create(&self) -> CreateFileSystemBuilder { diff --git a/sdk/storage/src/data_lake/clients/mod.rs b/sdk/storage/src/data_lake/clients/mod.rs index 67e6e134dc..29638ef9ec 100644 --- a/sdk/storage/src/data_lake/clients/mod.rs +++ b/sdk/storage/src/data_lake/clients/mod.rs @@ -1,4 +1,4 @@ mod data_lake_client; -pub use data_lake_client::{AsDataLakeClient, DataLakeClient}; +pub use data_lake_client::DataLakeClient; mod file_system_client; -pub use file_system_client::{AsFileSystemClient, FileSystemClient}; +pub use file_system_client::FileSystemClient; diff --git a/sdk/storage/src/data_lake/requests/list_file_systems_builder.rs b/sdk/storage/src/data_lake/requests/list_file_systems_builder.rs index 7a472c64a2..5b543d6a01 100644 --- a/sdk/storage/src/data_lake/requests/list_file_systems_builder.rs +++ b/sdk/storage/src/data_lake/requests/list_file_systems_builder.rs @@ -40,9 +40,7 @@ impl<'a> ListFileSystemsBuilder<'a> { pub async fn execute( &self, ) -> Result> { - // we clone this so we can add custom - // query parameters - let mut url = self.data_lake_client.url().clone(); + let mut url = url::Url::parse(self.data_lake_client.url())?; url.query_pairs_mut().append_pair("resource", "account"); diff --git a/sdk/storage/tests/data_lake.rs b/sdk/storage/tests/data_lake.rs index 25e1640e36..efb30c2101 100644 --- a/sdk/storage/tests/data_lake.rs +++ b/sdk/storage/tests/data_lake.rs @@ -31,13 +31,17 @@ async fn test_data_lake_file_system_functions() -> Result<(), Box