Skip to content

Commit 93f9bab

Browse files
Added AmqpSimpleValue to enable compile time checks on AmqpApplicationProperties
* Reduced a ton of clone calls; Added AmqpSimpleValue type
1 parent cef61c3 commit 93f9bab

22 files changed

+1423
-819
lines changed

sdk/core/azure_core_amqp/src/fe2o3/connection.rs

Lines changed: 32 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -74,39 +74,39 @@ impl AmqpConnectionApis for Fe2o3AmqpConnection {
7474
if let Some(idle_timeout) = options.idle_timeout {
7575
builder = builder.idle_time_out(idle_timeout.whole_milliseconds() as u32);
7676
}
77-
if let Some(outgoing_locales) = options.outgoing_locales.as_ref() {
78-
for locale in outgoing_locales {
79-
builder = builder.add_outgoing_locales(locale.as_str());
80-
}
77+
if let Some(outgoing_locales) = options.outgoing_locales {
78+
builder = builder.set_outgoing_locales(
79+
outgoing_locales
80+
.into_iter()
81+
.map(fe2o3_amqp_types::primitives::Symbol::from)
82+
.collect(),
83+
);
8184
}
8285
if let Some(incoming_locales) = options.incoming_locales {
83-
for locale in incoming_locales {
84-
builder = builder.add_incoming_locales(locale);
85-
}
86-
}
87-
if let Some(offered_capabilities) = options.offered_capabilities.as_ref() {
88-
for capability in offered_capabilities {
89-
let capability: fe2o3_amqp_types::primitives::Symbol =
90-
capability.clone().into();
91-
builder = builder.add_offered_capabilities(capability);
92-
}
93-
}
94-
if let Some(desired_capabilities) = options.desired_capabilities.as_ref() {
95-
for capability in desired_capabilities {
96-
let capability: fe2o3_amqp_types::primitives::Symbol =
97-
capability.clone().into();
98-
builder = builder.add_desired_capabilities(capability);
99-
}
100-
}
101-
if let Some(properties) = options.properties.as_ref() {
102-
let mut fields = fe2o3_amqp::types::definitions::Fields::new();
103-
for property in properties.iter() {
104-
let k = fe2o3_amqp_types::primitives::Symbol::from(property.0);
105-
let v = fe2o3_amqp_types::primitives::Value::from(property.1);
106-
107-
fields.insert(k, v);
108-
}
109-
builder = builder.properties(fields);
86+
builder = builder.set_incoming_locales(
87+
incoming_locales
88+
.into_iter()
89+
.map(fe2o3_amqp_types::primitives::Symbol::from)
90+
.collect(),
91+
);
92+
}
93+
if let Some(offered_capabilities) = options.offered_capabilities {
94+
builder = builder.set_offered_capabilities(
95+
offered_capabilities.into_iter().map(Into::into).collect(),
96+
);
97+
}
98+
if let Some(desired_capabilities) = options.desired_capabilities {
99+
builder = builder.set_desired_capabilities(
100+
desired_capabilities.into_iter().map(Into::into).collect(),
101+
);
102+
}
103+
if let Some(properties) = options.properties {
104+
builder = builder.properties(
105+
properties
106+
.iter()
107+
.map(|(k, v)| (k.into(), v.into()))
108+
.collect(),
109+
);
110110
}
111111
if let Some(buffer_size) = options.buffer_size {
112112
builder = builder.buffer_size(buffer_size);
@@ -160,7 +160,7 @@ impl AmqpConnectionApis for Fe2o3AmqpConnection {
160160
fe2o3_amqp_types::primitives::Symbol::from(condition),
161161
),
162162
description,
163-
info.map(|i| i.into()),
163+
info.map(Into::into),
164164
))
165165
.await
166166
.map_err(|e| azure_core::Error::from(Fe2o3ConnectionError(e)));

sdk/core/azure_core_amqp/src/fe2o3/error.rs

Lines changed: 40 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ use crate::{
55
error::{AmqpDescribedError, AmqpErrorCondition, AmqpErrorKind},
66
AmqpError,
77
};
8+
use std::str::FromStr;
89

910
// newtype implementations for fe2o3_amqp errors. These should only be used if the transform of the
1011
// fe2o3_amqp error directly to an AmqpError is not possible. This is the case for errors which end up
@@ -45,28 +46,20 @@ impl From<fe2o3_amqp::transport::Error> for Fe2o3TransportError {
4546
}
4647

4748
// Specializations of From for common AMQP types.
48-
impl From<fe2o3_amqp_types::definitions::ErrorCondition> for AmqpErrorCondition {
49-
fn from(e: fe2o3_amqp_types::definitions::ErrorCondition) -> Self {
49+
impl From<&fe2o3_amqp_types::definitions::ErrorCondition> for AmqpErrorCondition {
50+
fn from(e: &fe2o3_amqp_types::definitions::ErrorCondition) -> Self {
5051
match e {
5152
fe2o3_amqp_types::definitions::ErrorCondition::AmqpError(amqp_error) => {
52-
AmqpErrorCondition::from(crate::AmqpSymbol::from(
53-
fe2o3_amqp_types::primitives::Symbol::from(&amqp_error),
54-
))
53+
AmqpErrorCondition::from(amqp_error)
5554
}
5655
fe2o3_amqp_types::definitions::ErrorCondition::ConnectionError(connection_error) => {
57-
AmqpErrorCondition::from(crate::AmqpSymbol::from(
58-
fe2o3_amqp_types::primitives::Symbol::from(&connection_error),
59-
))
56+
AmqpErrorCondition::from(connection_error)
6057
}
6158
fe2o3_amqp_types::definitions::ErrorCondition::SessionError(session_error) => {
62-
AmqpErrorCondition::from(crate::AmqpSymbol::from(
63-
fe2o3_amqp_types::primitives::Symbol::from(&session_error),
64-
))
59+
AmqpErrorCondition::from(session_error)
6560
}
6661
fe2o3_amqp_types::definitions::ErrorCondition::LinkError(link_error) => {
67-
AmqpErrorCondition::from(crate::AmqpSymbol::from(
68-
fe2o3_amqp_types::primitives::Symbol::from(&link_error),
69-
))
62+
AmqpErrorCondition::from(link_error)
7063
}
7164
fe2o3_amqp_types::definitions::ErrorCondition::Custom(symbol) => {
7265
AmqpErrorCondition::from(crate::AmqpSymbol::from(symbol))
@@ -75,12 +68,42 @@ impl From<fe2o3_amqp_types::definitions::ErrorCondition> for AmqpErrorCondition
7568
}
7669
}
7770

71+
// Implement specific From traits for the error types we need instead of using a generic implementation
72+
impl From<&fe2o3_amqp_types::definitions::AmqpError> for AmqpErrorCondition {
73+
fn from(e: &fe2o3_amqp_types::definitions::AmqpError) -> Self {
74+
// Note that the `from_str` implementation from `create_extensible_enum` will
75+
// never return an error. So the `unwrap` is there to silence the compiler.
76+
AmqpErrorCondition::from_str(fe2o3_amqp_types::primitives::Symbol::from(e).as_str())
77+
.unwrap()
78+
}
79+
}
80+
81+
impl From<&fe2o3_amqp_types::definitions::ConnectionError> for AmqpErrorCondition {
82+
fn from(e: &fe2o3_amqp_types::definitions::ConnectionError) -> Self {
83+
AmqpErrorCondition::from_str(fe2o3_amqp_types::primitives::Symbol::from(e).as_str())
84+
.unwrap()
85+
}
86+
}
87+
88+
impl From<&fe2o3_amqp_types::definitions::SessionError> for AmqpErrorCondition {
89+
fn from(e: &fe2o3_amqp_types::definitions::SessionError) -> Self {
90+
AmqpErrorCondition::from_str(fe2o3_amqp_types::primitives::Symbol::from(e).as_str())
91+
.unwrap()
92+
}
93+
}
94+
95+
impl From<&fe2o3_amqp_types::definitions::LinkError> for AmqpErrorCondition {
96+
fn from(e: &fe2o3_amqp_types::definitions::LinkError) -> Self {
97+
AmqpErrorCondition::from_str(fe2o3_amqp_types::primitives::Symbol::from(e).as_str())
98+
.unwrap()
99+
}
100+
}
78101
impl From<fe2o3_amqp_types::definitions::Error> for AmqpDescribedError {
79102
fn from(e: fe2o3_amqp_types::definitions::Error) -> Self {
80103
AmqpDescribedError::new(
81-
e.condition.into(),
104+
(&e.condition).into(),
82105
e.description,
83-
e.info.unwrap_or_default().into(),
106+
(&e.info.unwrap_or_default()).into(),
84107
)
85108
}
86109
}
@@ -162,7 +185,7 @@ mod tests {
162185
let error = fe2o3_amqp_types::definitions::ErrorCondition::$fe2o3_type(
163186
fe2o3_amqp_types::definitions::$fe2o3_type::$variant,
164187
);
165-
let amqp_error = AmqpErrorCondition::from(error);
188+
let amqp_error = AmqpErrorCondition::from(&error);
166189
assert_eq!(amqp_error, AmqpErrorCondition::$amqp_variant);
167190
}
168191
};

sdk/core/azure_core_amqp/src/fe2o3/management.rs

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ use crate::{
77
error::AmqpErrorKind,
88
management::AmqpManagementApis,
99
session::AmqpSession,
10+
simple_value::AmqpSimpleValue,
1011
value::{AmqpOrderedMap, AmqpValue},
1112
AmqpError,
1213
};
@@ -92,7 +93,7 @@ impl AmqpManagementApis for Fe2o3AmqpManagement {
9293
async fn call(
9394
&self,
9495
operation_type: String,
95-
application_properties: AmqpOrderedMap<String, AmqpValue>,
96+
application_properties: AmqpOrderedMap<String, AmqpSimpleValue>,
9697
) -> Result<AmqpOrderedMap<String, AmqpValue>> {
9798
let mut management = self
9899
.management
@@ -112,19 +113,11 @@ impl AmqpManagementApis for Fe2o3AmqpManagement {
112113
let e = AmqpError::try_from(e)?;
113114
Err(e.into())
114115
} else {
115-
Ok(response.unwrap().entity_attributes.into())
116+
Ok((&response.unwrap().entity_attributes).into())
116117
}
117118
}
118119
}
119120

120-
// impl TryFrom<Fe2o3ManagementError> for azure_core::Error {
121-
// type Error = azure_core::Error;
122-
// fn try_from(e: Fe2o3ManagementError) -> std::result::Result<Self, Self::Error> {
123-
// let e = AmqpError::try_from(e.0)?;
124-
// Ok(e.into())
125-
// }
126-
// }
127-
128121
impl TryFrom<fe2o3_amqp_management::error::Error> for AmqpError {
129122
type Error = azure_core::Error;
130123
fn try_from(e: fe2o3_amqp_management::error::Error) -> std::result::Result<Self, Self::Error> {
@@ -161,14 +154,14 @@ impl From<fe2o3_amqp_management::error::AttachError> for AmqpError {
161154
struct WithApplicationPropertiesRequest<'a> {
162155
entity_type: String,
163156
access_token: &'a AccessToken,
164-
application_properties: AmqpOrderedMap<String, AmqpValue>,
157+
application_properties: AmqpOrderedMap<String, AmqpSimpleValue>,
165158
}
166159

167160
impl<'a> WithApplicationPropertiesRequest<'a> {
168161
pub fn new(
169162
entity_type: String,
170163
access_token: &'a AccessToken,
171-
application_properties: AmqpOrderedMap<String, AmqpValue>,
164+
application_properties: AmqpOrderedMap<String, AmqpSimpleValue>,
172165
) -> Self {
173166
Self {
174167
entity_type,

0 commit comments

Comments
 (0)