Skip to content

Commit 3bd0b02

Browse files
authored
Simplify ClientOptions (#3016)
Resolves #2956 by making nested options non-`Option`. Only leaf fields should be optional. An `Option<T>` allocates as much space as `T` regardless, so why deal with all the hassle - both for callers and callees - of dealing with `Option<T>` for intermediate members?
1 parent 892d3d8 commit 3bd0b02

File tree

33 files changed

+186
-203
lines changed

33 files changed

+186
-203
lines changed

sdk/core/azure_core/CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,10 @@
66

77
### Breaking Changes
88

9+
- Changed `ClientOptions::retry` from `Option<RetryOptions>` to `RetryOptions`.
910
- Removed several unreferenced HTTP headers and accessor structures for those headers.
11+
- Renamed `TransportOptions` to `Transport`.
12+
- Renamed `TransportOptions::new_custom_policy()` to `Transport::with_policy()`.
1013

1114
### Bugs Fixed
1215

sdk/core/azure_core/README.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -436,7 +436,7 @@ In many cases with `reqwest`, importing features may be enough. See their [docum
436436
If you do need to write code to customize the `reqwest::Client`, you can pass it in `ClientOptions` to our client libraries:
437437

438438
```rust no_run
439-
use azure_core::http::{ClientOptions, TransportOptions};
439+
use azure_core::http::{ClientOptions, Transport};
440440
use azure_identity::DeveloperToolsCredential;
441441
use azure_security_keyvault_secrets::{SecretClient, SecretClientOptions};
442442
use std::sync::Arc;
@@ -445,7 +445,7 @@ let http_client = Arc::new(reqwest::ClientBuilder::new().gzip(true).build().unwr
445445

446446
let options = SecretClientOptions {
447447
client_options: ClientOptions {
448-
transport: Some(TransportOptions::new(http_client)),
448+
transport: Some(Transport::new(http_client)),
449449
..Default::default()
450450
},
451451
..Default::default()
@@ -611,7 +611,7 @@ and set that as the transport in any `ClientOptions` used to configure your Azur
611611

612612
```rust no_run
613613
use std::sync::Arc;
614-
use azure_core::http::{HttpClient, ClientOptions, TransportOptions};
614+
use azure_core::http::{HttpClient, ClientOptions, Transport};
615615
use azure_security_keyvault_secrets::SecretClientOptions;
616616

617617
let client = Arc::new(
@@ -624,7 +624,7 @@ let client = Arc::new(
624624

625625
let options = SecretClientOptions {
626626
client_options: ClientOptions {
627-
transport: Some(TransportOptions::new(client.clone())),
627+
transport: Some(Transport::new(client.clone())),
628628
..Default::default()
629629
},
630630
..Default::default()

sdk/core/azure_core/benches/http_transport_benchmarks.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use azure_core::{
66
fmt::SafeDebug,
77
http::{
88
BufResponse, ClientMethodOptions, ClientOptions, HttpClient, Method, Pipeline, Request,
9-
TransportOptions, Url,
9+
Transport, Url,
1010
},
1111
Result,
1212
};
@@ -168,7 +168,7 @@ pub fn disable_pooling_http_transport_test(c: &mut Criterion) {
168168
let transport = new_reqwest_client_disable_connection_pool();
169169
let options = TestServiceClientOptions {
170170
client_options: ClientOptions {
171-
transport: Some(TransportOptions::new(transport)),
171+
transport: Some(Transport::new(transport)),
172172
..Default::default()
173173
},
174174
..Default::default()

sdk/core/azure_core/examples/core_pager.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
use azure_core::{
55
credentials::TokenCredential,
6-
http::{headers::Headers, BufResponse, HttpClient, Method, StatusCode, TransportOptions},
6+
http::{headers::Headers, BufResponse, HttpClient, Method, StatusCode, Transport},
77
};
88
use azure_core_test::{credentials::MockCredential, http::MockHttpClient};
99
use azure_security_keyvault_secrets::{ResourceExt, SecretClient, SecretClientOptions};
@@ -21,7 +21,7 @@ async fn test_pager() -> Result<(), Box<dyn std::error::Error>> {
2121
// You normally would create credentials from `azure_identity` and
2222
// use the default transport in production.
2323
let (credential, transport) = setup()?;
24-
options.client_options.transport = Some(TransportOptions::new(transport));
24+
options.client_options.transport = Some(Transport::new(transport));
2525

2626
let client = SecretClient::new(
2727
"https://my-vault.vault.azure.net",

sdk/core/azure_core/examples/core_poller.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use azure_core::{
55
credentials::TokenCredential,
66
http::{
77
headers::{Headers, RETRY_AFTER},
8-
BufResponse, HttpClient, Method, StatusCode, TransportOptions,
8+
BufResponse, HttpClient, Method, StatusCode, Transport,
99
},
1010
};
1111
use azure_core_test::{credentials::MockCredential, http::MockHttpClient};
@@ -26,7 +26,7 @@ async fn test_poller() -> Result<(), Box<dyn std::error::Error>> {
2626
// You normally would create credentials from `azure_identity` and
2727
// use the default transport in production.
2828
let (credential, transport) = setup()?;
29-
options.client_options.transport = Some(TransportOptions::new(transport));
29+
options.client_options.transport = Some(Transport::new(transport));
3030

3131
let client = CertificateClient::new(
3232
"https://my-vault.vault.azure.net",

sdk/core/azure_core/examples/core_remove_user_agent.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ use azure_core::{
77
http::{
88
headers::Headers,
99
policies::{Policy, PolicyResult},
10-
BufResponse, Context, HttpClient, Method, Request, StatusCode, TransportOptions,
10+
BufResponse, Context, HttpClient, Method, Request, StatusCode, Transport,
1111
},
1212
};
1313
use azure_core_test::{credentials::MockCredential, http::MockHttpClient};
@@ -52,7 +52,7 @@ async fn test_remove_user_agent() -> Result<(), Box<dyn std::error::Error>> {
5252
// You normally would create credentials from `azure_identity` and
5353
// use the default transport in production.
5454
let (credential, transport) = setup()?;
55-
options.client_options.transport = Some(TransportOptions::new(transport));
55+
options.client_options.transport = Some(Transport::new(transport));
5656

5757
// Construct the client with these options and a shared credential.
5858
let client = SecretClient::new(

sdk/core/azure_core/examples/core_ureq_client.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
use async_trait::async_trait;
55
use azure_core::{
66
error::ErrorKind,
7-
http::{headers::Headers, BufResponse, ClientOptions, HttpClient, Request, TransportOptions},
7+
http::{headers::Headers, BufResponse, ClientOptions, HttpClient, Request, Transport},
88
};
99
use azure_identity::DeveloperToolsCredential;
1010
use azure_security_keyvault_secrets::{ResourceExt as _, SecretClient, SecretClientOptions};
@@ -56,7 +56,7 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
5656
let agent = Arc::new(Agent::default());
5757
let options = SecretClientOptions {
5858
client_options: ClientOptions {
59-
transport: Some(TransportOptions::new(agent)),
59+
transport: Some(Transport::new(agent)),
6060
..Default::default()
6161
},
6262
..Default::default()

sdk/core/azure_core/src/http/options/mod.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use std::sync::Arc;
99
use typespec_client_core::http::policies::Policy;
1010
pub use typespec_client_core::http::{
1111
ClientMethodOptions, ExponentialRetryOptions, FixedRetryOptions, LoggingOptions,
12-
PipelineOptions, RetryOptions, TransportOptions,
12+
PipelineOptions, RetryOptions, Transport,
1313
};
1414
pub use user_agent::*;
1515

@@ -23,19 +23,19 @@ pub struct ClientOptions {
2323
pub per_try_policies: Vec<Arc<dyn Policy>>,
2424

2525
/// Retry options.
26-
pub retry: Option<RetryOptions>,
26+
pub retry: RetryOptions,
2727

2828
/// Transport options.
29-
pub transport: Option<TransportOptions>,
29+
pub transport: Option<Transport>,
3030

3131
/// User-Agent telemetry options.
32-
pub user_agent: Option<UserAgentOptions>,
32+
pub user_agent: UserAgentOptions,
3333

3434
/// Options for request instrumentation, such as distributed tracing.
3535
///
3636
/// If not specified, defaults to no instrumentation.
3737
///
38-
pub instrumentation: Option<InstrumentationOptions>,
38+
pub instrumentation: InstrumentationOptions,
3939

4040
/// Logging options
4141
///
@@ -65,8 +65,8 @@ impl ClientOptions {
6565

6666
(
6767
CoreClientOptions {
68-
user_agent: self.user_agent.unwrap_or_default(),
69-
instrumentation: self.instrumentation.unwrap_or_default(),
68+
user_agent: self.user_agent,
69+
instrumentation: self.instrumentation,
7070
},
7171
options,
7272
)

sdk/core/azure_core/src/http/pipeline.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ mod tests {
141141
headers::{self, HeaderName, Headers},
142142
policies::Policy,
143143
request::options::ClientRequestId,
144-
BufResponse, ClientOptions, Context, Method, Request, StatusCode, TransportOptions,
144+
BufResponse, ClientOptions, Context, Method, Request, StatusCode, Transport,
145145
UserAgentOptions,
146146
},
147147
Bytes,
@@ -160,7 +160,7 @@ mod tests {
160160
let mut ctx = Context::new();
161161
ctx.insert(ClientRequestId::new(CLIENT_REQUEST_ID.to_string()));
162162

163-
let transport = TransportOptions::new(Arc::new(MockHttpClient::new(|req| {
163+
let transport = Transport::new(Arc::new(MockHttpClient::new(|req| {
164164
async {
165165
// Assert
166166
let header_value = req
@@ -218,7 +218,7 @@ mod tests {
218218
let mut ctx = Context::new();
219219
ctx.insert(ClientRequestId::new(CLIENT_REQUEST_ID.to_string()));
220220

221-
let transport = TransportOptions::new(Arc::new(MockHttpClient::new(|req| {
221+
let transport = Transport::new(Arc::new(MockHttpClient::new(|req| {
222222
async {
223223
// Assert
224224
let header_value = req
@@ -269,7 +269,7 @@ mod tests {
269269
// Arrange
270270
let ctx = Context::new();
271271

272-
let transport = TransportOptions::new(Arc::new(MockHttpClient::new(|req| {
272+
let transport = Transport::new(Arc::new(MockHttpClient::new(|req| {
273273
async {
274274
// Assert
275275
let user_agent = req
@@ -324,7 +324,7 @@ mod tests {
324324
const CUSTOM_APPLICATION_ID: &str = "my-custom-app/2.1.0";
325325
let ctx = Context::new();
326326

327-
let transport = TransportOptions::new(Arc::new(MockHttpClient::new(|req| {
327+
let transport = Transport::new(Arc::new(MockHttpClient::new(|req| {
328328
async {
329329
// Assert
330330
let user_agent = req
@@ -354,7 +354,7 @@ mod tests {
354354

355355
let options = ClientOptions {
356356
transport: Some(transport),
357-
user_agent: Some(user_agent_options),
357+
user_agent: user_agent_options,
358358
..Default::default()
359359
};
360360

sdk/core/azure_core/src/http/policies/bearer_token_policy.rs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ mod tests {
156156
Arc,
157157
};
158158
use typespec_client_core::{
159-
http::{policies::TransportPolicy, BufResponse, Method, TransportOptions},
159+
http::{policies::TransportPolicy, BufResponse, Method, Transport},
160160
time::Duration,
161161
};
162162

@@ -211,9 +211,7 @@ mod tests {
211211
let credential = MockCredential::new(&[]);
212212
let policy = BearerTokenCredentialPolicy::new(Arc::new(credential), ["scope"]);
213213
let client = MockHttpClient::new(|_| panic!("expected an error from get_token"));
214-
let transport = Arc::new(TransportPolicy::new(TransportOptions::new(Arc::new(
215-
client,
216-
))));
214+
let transport = Arc::new(TransportPolicy::new(Transport::new(Arc::new(client))));
217215
let mut req = Request::new("https://localhost".parse().unwrap(), Method::Get);
218216

219217
let err = policy
@@ -249,7 +247,7 @@ mod tests {
249247
}
250248
.boxed()
251249
}));
252-
let transport = Arc::new(TransportPolicy::new(TransportOptions::new(client)));
250+
let transport = Arc::new(TransportPolicy::new(Transport::new(client)));
253251

254252
let mut handles = vec![];
255253
for _ in 0..4 {

0 commit comments

Comments
 (0)