Skip to content

Commit 515945f

Browse files
authored
move case_insensitive_deserialize to azure_core::util (#453)
1 parent 4b54435 commit 515945f

File tree

12 files changed

+1228
-728
lines changed

12 files changed

+1228
-728
lines changed

sdk/core/src/util.rs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
use bytes::Bytes;
22
use http::header::{AsHeaderName, HeaderMap, HeaderName, HeaderValue};
33
use http::{self, request::Builder};
4+
use serde::{
5+
de::{self, DeserializeOwned, Deserializer},
6+
Deserialize,
7+
};
8+
49
use std::{convert::TryFrom, fmt::Display, str::FromStr};
510

611
pub fn format_header_value<D: Display>(value: D) -> Result<HeaderValue, http::Error> {
@@ -102,6 +107,17 @@ pub fn slice_bom(bytes: &Bytes) -> Bytes {
102107
}
103108
}
104109

110+
pub fn case_insensitive_deserialize<'de, T, D>(deserializer: D) -> Result<T, D::Error>
111+
where
112+
T: DeserializeOwned + std::fmt::Debug,
113+
D: Deserializer<'de>,
114+
{
115+
let v = String::deserialize(deserializer)?;
116+
T::deserialize(serde_json::Value::String(v.clone()))
117+
.or_else(|_| T::deserialize(serde_json::Value::String(v.to_lowercase())))
118+
.map_err(de::Error::custom)
119+
}
120+
105121
#[cfg(test)]
106122
mod test {
107123
use super::*;

services/autorust/codegen/src/codegen_models.rs

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@ pub fn create_models(cg: &CodeGen) -> Result<TokenStream, Error> {
3030
});
3131
if has_case_workaround {
3232
file.extend(quote! {
33-
use serde::de::{self, Deserializer, DeserializeOwned};
34-
})
33+
use azure_core::util::case_insensitive_deserialize;
34+
});
3535
}
3636

3737
let mut all_schemas: IndexMap<RefKey, ResolvedSchema> = IndexMap::new();
@@ -57,18 +57,6 @@ pub fn create_models(cg: &CodeGen) -> Result<TokenStream, Error> {
5757
}
5858
}
5959

60-
if has_case_workaround {
61-
file.extend(quote! {
62-
fn case_insensitive<'de, T, D>(deserializer: D) -> Result<T, D::Error>
63-
where T: DeserializeOwned + std::fmt::Debug,
64-
D: Deserializer<'de>
65-
{
66-
let v = String::deserialize(deserializer)?;
67-
T::deserialize(serde_json::Value::String(v.clone())).or_else(|_| T::deserialize(serde_json::Value::String(v.to_lowercase()))).map_err(de::Error::custom)
68-
}
69-
});
70-
}
71-
7260
let mut schema_names = IndexMap::new();
7361
for (ref_key, schema) in &all_schemas {
7462
let doc_file = &ref_key.file_path;
@@ -231,7 +219,7 @@ fn create_struct(cg: &CodeGen, doc_file: &Path, struct_name: &str, schema: &Reso
231219
}
232220
}
233221
if is_local_enum(property) && lowercase_workaround {
234-
serde_attrs.push(quote! { deserialize_with = "case_insensitive"});
222+
serde_attrs.push(quote! { deserialize_with = "case_insensitive_deserialize"});
235223
}
236224
let serde = if !serde_attrs.is_empty() {
237225
quote! { #[serde(#(#serde_attrs),*)] }

0 commit comments

Comments
 (0)