diff --git a/Cargo.lock b/Cargo.lock index 09b0c144b7..9cfc87efbe 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -151,7 +151,7 @@ checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.110", ] [[package]] @@ -162,7 +162,7 @@ checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.110", ] [[package]] @@ -202,6 +202,7 @@ dependencies = [ "futures", "hmac", "http", + "include-file", "json-patch", "openssl", "pin-project", @@ -247,7 +248,7 @@ version = "0.4.1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.110", "tokio", "tracing", "tracing-subscriber", @@ -306,7 +307,7 @@ dependencies = [ "azure_core_test", "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.110", "tokio", ] @@ -621,7 +622,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.110", ] [[package]] @@ -710,7 +711,7 @@ dependencies = [ "quote", "serde", "serde_json", - "syn 2.0.104", + "syn 2.0.110", "tempfile", "toml", ] @@ -803,7 +804,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.110", ] [[package]] @@ -970,7 +971,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.104", + "syn 2.0.110", ] [[package]] @@ -981,7 +982,7 @@ checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" dependencies = [ "darling_core", "quote", - "syn 2.0.104", + "syn 2.0.110", ] [[package]] @@ -1012,7 +1013,7 @@ checksum = "30542c1ad912e0e3d22a1935c290e12e8a29d704a420177a31faad4a601a0800" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.110", ] [[package]] @@ -1034,7 +1035,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.110", ] [[package]] @@ -1287,7 +1288,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.110", ] [[package]] @@ -1631,6 +1632,16 @@ dependencies = [ "icu_properties", ] +[[package]] +name = "include-file" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f134d94825032d15a87baf75e1311282cedf961cc09f1df65b37b643edb51228" +dependencies = [ + "proc-macro2", + "syn 2.0.110", +] + [[package]] name = "indexmap" version = "2.10.0" @@ -1929,7 +1940,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.110", ] [[package]] @@ -2089,7 +2100,7 @@ checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.110", ] [[package]] @@ -2173,9 +2184,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.97" +version = "1.0.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d61789d7719defeb74ea5fe81f2fdfdbd28a803847077cecce2ff14e1472f6f1" +checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" dependencies = [ "unicode-ident", ] @@ -2614,7 +2625,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.110", ] [[package]] @@ -2634,7 +2645,7 @@ checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.110", ] [[package]] @@ -2657,7 +2668,7 @@ checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.110", ] [[package]] @@ -2712,7 +2723,7 @@ checksum = "5d69265a08751de7844521fd15003ae0a888e035773ba05695c5c759a6f89eef" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.110", ] [[package]] @@ -2815,9 +2826,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.104" +version = "2.0.110" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17b6f705963418cdb9927482fa304bc562ece2fdd4f616084c50b7023b435a40" +checksum = "a99801b5bd34ede4cf3fc688c5919368fea4e4814a4664359503e6015b280aea" dependencies = [ "proc-macro2", "quote", @@ -2841,7 +2852,7 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.110", ] [[package]] @@ -2899,7 +2910,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.110", ] [[package]] @@ -2910,7 +2921,7 @@ checksum = "cc5b44b4ab9c2fdd0e0512e6bece8388e214c0749f5862b114cc5b7a25daf227" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.110", ] [[package]] @@ -3016,7 +3027,7 @@ checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.110", ] [[package]] @@ -3158,7 +3169,7 @@ checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.110", ] [[package]] @@ -3208,7 +3219,7 @@ checksum = "70977707304198400eb4835a78f6a9f928bf41bba420deb8fdb175cd965d77a7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.110", ] [[package]] @@ -3275,7 +3286,7 @@ dependencies = [ "rustc_version", "serde", "serde_json", - "syn 2.0.104", + "syn 2.0.110", "tokio", "typespec_client_core", ] @@ -3448,7 +3459,7 @@ dependencies = [ "log", "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.110", "wasm-bindgen-shared", ] @@ -3483,7 +3494,7 @@ checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.110", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -3518,7 +3529,7 @@ checksum = "17d5042cc5fa009658f9a7333ef24291b1291a25b6382dd68862a7f3b969f69b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.110", ] [[package]] @@ -3791,7 +3802,7 @@ checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.110", "synstructure", ] @@ -3812,7 +3823,7 @@ checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.110", ] [[package]] @@ -3832,7 +3843,7 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.110", "synstructure", ] @@ -3872,7 +3883,7 @@ checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.110", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 73ec8f5fde..c05a98058b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -109,6 +109,7 @@ futures = "0.3" getrandom = { version = "0.3" } gloo-timers = { version = "0.3" } hmac = { version = "0.12" } +include-file = { version = "0.4.0" } litemap = "0.7.4" openssl = { version = "0.10.72" } opentelemetry = { version = "0.30", features = ["trace"] } diff --git a/sdk/core/azure_core/Cargo.toml b/sdk/core/azure_core/Cargo.toml index 30961e2bc8..c5953d5c51 100644 --- a/sdk/core/azure_core/Cargo.toml +++ b/sdk/core/azure_core/Cargo.toml @@ -45,6 +45,7 @@ azure_security_keyvault_certificates.path = "../../keyvault/azure_security_keyva azure_security_keyvault_secrets.path = "../../keyvault/azure_security_keyvault_secrets" criterion.workspace = true http = "1.3.1" +include-file.workspace = true json-patch = "4.1.0" reqwest.workspace = true thiserror.workspace = true diff --git a/sdk/core/azure_core/README.md b/sdk/core/azure_core/README.md index 008cbe862b..0db0a2c87e 100644 --- a/sdk/core/azure_core/README.md +++ b/sdk/core/azure_core/README.md @@ -444,6 +444,27 @@ let client = SecretClient::new( See the [example](https://github.com/Azure/azure-sdk-for-rust/blob/main/sdk/core/azure_core/examples/core_remove_user_agent.rs) for a full sample implementation. +### JSON Merge Patch + +Azure SDK for Rust does not explicitly support [JSON merge patch](https://www.rfc-editor.org/rfc/rfc7386), but it does allow you to update the payload accordingly and send it back to the service. + +```rust ignore json_merge_patch +let mut resource: azure_core::Value = client.get_resource("foo", None).await?.body().json()?; + +// Change the description and update tags. +resource["description"] = "an updated foo".into(); +if let Some(tags) = resource["tags"].as_object_mut() { + tags["test"] = true.into(); + tags.insert("version".into(), 1.into()); +} + +// Update the resource and assert expected properties. +let resource = client + .update_resource("foo", resource.try_into()?, None) + .await? + .into_model()?; +``` + ### Replacing the HTTP client Though `azure_core` uses [`reqwest`] for its default HTTP client, you can replace it with either a customized `reqwest::Client` or an entirely different HTTP client. diff --git a/sdk/core/azure_core/examples/core_json_merge_patch.rs b/sdk/core/azure_core/examples/core_json_merge_patch.rs index 54b089d201..35d37cd7af 100644 --- a/sdk/core/azure_core/examples/core_json_merge_patch.rs +++ b/sdk/core/azure_core/examples/core_json_merge_patch.rs @@ -3,6 +3,7 @@ use azure_core::{http::Transport, Value}; use example::{setup, ExampleClient, ExampleClientOptions}; +use include_file::include_markdown; /// This example demonstrates deserializing a standard Azure error response to get more details. async fn example_json_merge_patch() -> Result<(), Box> { @@ -16,22 +17,11 @@ async fn example_json_merge_patch() -> Result<(), Box> { let client = ExampleClient::new("https://api.contoso.com", Some(options))?; + println!("{}", env!("CARGO_MANIFEST_DIR")); + // Azure SDK for Rust does not implement support for JSON merge patch directly, // but does allow you to de/serialize your own models including a generic JSON `Value`. - let mut resource: Value = client.get_resource("foo", None).await?.body().json()?; - - // Change the description and update tags. - resource["description"] = "an updated foo".into(); - if let Some(tags) = resource["tags"].as_object_mut() { - tags["test"] = true.into(); - tags.insert("version".into(), 1.into()); - } - - // Update the resource and assert expected properties. - let resource = client - .update_resource("foo", resource.try_into()?, None) - .await? - .into_model()?; + include_markdown!("README.md", "json_merge_patch"); assert_eq!(resource.id.as_deref(), Some("foo")); assert_eq!(resource.description.as_deref(), Some("an updated foo"));