prost-reflect-derive-0.15.0/.cargo_vcs_info.json0000644000000001620000000000100151630ustar { "git": { "sha1": "a9aa70acf981dde70593d67e2138ec884d81a34d" }, "path_in_vcs": "prost-reflect-derive" }prost-reflect-derive-0.15.0/Cargo.lock0000644000000220360000000000100131420ustar # This file is automatically @generated by Cargo. # It is not intended for manual editing. version = 3 [[package]] name = "anyhow" version = "1.0.97" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dcfed56ad506cb2c684a14971b8861fdc3baaaae314b9e5f9bb532cbe3ba7a4f" [[package]] name = "bytes" version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" [[package]] name = "either" version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" [[package]] name = "equivalent" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "glob" version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" [[package]] name = "hashbrown" version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" [[package]] name = "indexmap" version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3954d50fe15b02142bf25d3b8bdadb634ec3948f103d04ffe3031bc8fe9d7058" dependencies = [ "equivalent", "hashbrown", ] [[package]] name = "itertools" version = "0.10.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" dependencies = [ "either", ] [[package]] name = "itoa" version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" [[package]] name = "memchr" version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] name = "once_cell" version = "1.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d75b0bedcc4fe52caa0e03d9f1151a323e4aa5e2d78ba3580400cd3c9e2bc4bc" [[package]] name = "proc-macro2" version = "1.0.94" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a31971752e70b8b2686d7e46ec17fb38dad4051d94024c88df49b667caea9c84" dependencies = [ "unicode-ident", ] [[package]] name = "prost" version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2796faa41db3ec313a31f7624d9286acf277b52de526150b7e69f3debf891ee5" dependencies = [ "bytes", "prost-derive", ] [[package]] name = "prost-derive" version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a56d757972c98b346a9b766e3f02746cde6dd1cd1d1d563472929fdd74bec4d" dependencies = [ "anyhow", "itertools", "proc-macro2", "quote", "syn", ] [[package]] name = "prost-reflect-derive" version = "0.15.0" dependencies = [ "once_cell", "proc-macro2", "prost", "quote", "syn", "trybuild", ] [[package]] name = "quote" version = "1.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" dependencies = [ "proc-macro2", ] [[package]] name = "ryu" version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" [[package]] name = "serde" version = "1.0.219" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" version = "1.0.219" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "serde_json" version = "1.0.140" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" dependencies = [ "itoa", "memchr", "ryu", "serde", ] [[package]] name = "serde_spanned" version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" dependencies = [ "serde", ] [[package]] name = "syn" version = "2.0.100" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b09a44accad81e1ba1cd74a32461ba89dee89095ba17b32f5d03683b1b1fc2a0" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] [[package]] name = "target-triple" version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1ac9aa371f599d22256307c24a9d748c041e548cbf599f35d890f9d365361790" [[package]] name = "termcolor" version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" dependencies = [ "winapi-util", ] [[package]] name = "toml" version = "0.8.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cd87a5cdd6ffab733b2f74bc4fd7ee5fff6634124999ac278c35fc78c6120148" dependencies = [ "serde", "serde_spanned", "toml_datetime", "toml_edit", ] [[package]] name = "toml_datetime" version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" dependencies = [ "serde", ] [[package]] name = "toml_edit" version = "0.22.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "17b4795ff5edd201c7cd6dca065ae59972ce77d1b80fa0a84d94950ece7d1474" dependencies = [ "indexmap", "serde", "serde_spanned", "toml_datetime", "winnow", ] [[package]] name = "trybuild" version = "1.0.104" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6ae08be68c056db96f0e6c6dd820727cca756ced9e1f4cc7fdd20e2a55e23898" dependencies = [ "glob", "serde", "serde_derive", "serde_json", "target-triple", "termcolor", "toml", ] [[package]] name = "unicode-ident" version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" [[package]] name = "winapi-util" version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" dependencies = [ "windows-sys", ] [[package]] name = "windows-sys" version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ "windows-targets", ] [[package]] name = "windows-targets" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ "windows_aarch64_gnullvm", "windows_aarch64_msvc", "windows_i686_gnu", "windows_i686_gnullvm", "windows_i686_msvc", "windows_x86_64_gnu", "windows_x86_64_gnullvm", "windows_x86_64_msvc", ] [[package]] name = "windows_aarch64_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" [[package]] name = "windows_aarch64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" [[package]] name = "windows_i686_gnu" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" [[package]] name = "windows_i686_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" [[package]] name = "windows_i686_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" [[package]] name = "windows_x86_64_gnu" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" [[package]] name = "windows_x86_64_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" [[package]] name = "windows_x86_64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winnow" version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0e97b544156e9bebe1a0ffbc03484fc1ffe3100cbce3ffb17eac35f7cdd7ab36" dependencies = [ "memchr", ] prost-reflect-derive-0.15.0/Cargo.toml0000644000000034470000000000100131720ustar # THIS FILE IS AUTOMATICALLY GENERATED BY CARGO # # When uploading crates to the registry Cargo will automatically # "normalize" Cargo.toml files for maximal compatibility # with all versions of Cargo and also rewrite `path` dependencies # to registry (e.g., crates.io) dependencies. # # If you are reading this file be aware that the original Cargo.toml # will likely look very different (and much more reasonable). # See Cargo.toml.orig for the original contents. [package] edition = "2021" rust-version = "1.74.0" name = "prost-reflect-derive" version = "0.15.0" authors = ["Andrew Hickman "] build = false exclude = ["tests"] autolib = false autobins = false autoexamples = false autotests = false autobenches = false description = "A derive macro for prost-reflect to generate ReflectMessage implementations" documentation = "https://docs.rs/prost-reflect-derive" readme = "README.md" keywords = [ "protobuf", "serialization", "json", ] categories = ["encoding"] license = "MIT OR Apache-2.0" repository = "https://github.com/andrewhickman/prost-reflect" [package.metadata.release] pre-release-commit-message = "(cargo-release) {{crate_name}} version {{version}}" tag = false [[package.metadata.release.pre-release-replacements]] exactly = 1 file = "src/lib.rs" replace = 'html_root_url = "https://docs.rs/prost-reflect-derive/{{version}}/"' search = 'html_root_url = "https://docs.rs/prost-reflect-derive/.*?/"' [lib] name = "prost_reflect_derive" path = "src/lib.rs" test = false doctest = false proc-macro = true [dependencies.proc-macro2] version = "1.0.36" [dependencies.quote] version = "1.0.14" [dependencies.syn] version = "2.0.32" [dev-dependencies.once_cell] version = "1.13.0" [dev-dependencies.prost] version = "0.13.0" [dev-dependencies.trybuild] version = "1.0.84" prost-reflect-derive-0.15.0/Cargo.toml.orig000064400000000000000000000023001046102023000166360ustar 00000000000000[package] name = "prost-reflect-derive" description = "A derive macro for prost-reflect to generate ReflectMessage implementations" keywords = ["protobuf", "serialization", "json"] categories = ["encoding"] version = "0.15.0" authors = ["Andrew Hickman "] repository = "https://github.com/andrewhickman/prost-reflect" documentation = "https://docs.rs/prost-reflect-derive" license = "MIT OR Apache-2.0" readme = "../README.md" edition = "2021" rust-version = "1.74.0" autotests = false exclude = ["tests"] [lib] proc-macro = true doctest = false test = false [[test]] name = "tests" path = "tests/tests.rs" [dependencies] proc-macro2 = "1.0.36" quote = "1.0.14" syn = "2.0.32" [dev-dependencies] once_cell = "1.13.0" prost = "0.13.0" prost-reflect = { path = "../prost-reflect", features = ["derive"] } trybuild = "1.0.84" [[package.metadata.release.pre-release-replacements]] file = "src/lib.rs" search = "html_root_url = \"https://docs.rs/prost-reflect-derive/.*?/\"" replace = "html_root_url = \"https://docs.rs/prost-reflect-derive/{{version}}/\"" exactly = 1 [package.metadata.release] tag = false pre-release-commit-message = "(cargo-release) {{crate_name}} version {{version}}" prost-reflect-derive-0.15.0/LICENSE-APACHE000064400000000000000000000000211046102023000156710ustar 00000000000000../LICENSE-APACHEprost-reflect-derive-0.15.0/LICENSE-MIT000064400000000000000000000000161046102023000154050ustar 00000000000000../LICENSE-MITprost-reflect-derive-0.15.0/README.md000064400000000000000000000150271046102023000152400ustar 00000000000000[![crates.io](https://img.shields.io/crates/v/prost-reflect.svg)](https://crates.io/crates/prost-reflect/) [![docs.rs](https://docs.rs/prost-reflect/badge.svg)](https://docs.rs/prost-reflect/) [![deps.rs](https://deps.rs/crate/prost-reflect/0.15.0/status.svg)](https://deps.rs/crate/prost-reflect) ![MSRV](https://img.shields.io/badge/rustc-1.64+-blue.svg) [![Continuous integration](https://github.com/andrewhickman/prost-reflect/actions/workflows/ci.yml/badge.svg)](https://github.com/andrewhickman/prost-reflect/actions/workflows/ci.yml) [![codecov.io](https://codecov.io/gh/andrewhickman/prost-reflect/branch/main/graph/badge.svg?token=E2OITYXO7M)](https://codecov.io/gh/andrewhickman/prost-reflect) ![Apache 2.0 OR MIT licensed](https://img.shields.io/badge/license-Apache2.0%2FMIT-blue.svg) # prost-reflect A protobuf library extending [`prost`](https://crates.io/crates/prost) with reflection support and dynamic messages. ## Usage This crate provides support for dynamic protobuf messages. These are useful when the protobuf type definition is not known ahead of time. The main entry points into the API of this crate are: - [`DescriptorPool`] wraps a [`FileDescriptorSet`][prost_types::FileDescriptorSet] output by the protobuf compiler to provide an API for inspecting type definitions. - [`DynamicMessage`] provides encoding, decoding and reflection of an arbitrary protobuf message definition described by a [`MessageDescriptor`]. ### Example - decoding `DynamicMessage` does not implement [`Default`] since it needs a message descriptor to function. To decode a protobuf byte stream into an instance of this type, use [`DynamicMessage::decode`] to create a default value for the `MessageDescriptor` instance and merge into it: ```rust use prost::Message; use prost_types::FileDescriptorSet; use prost_reflect::{DynamicMessage, DescriptorPool, Value}; let pool = DescriptorPool::decode(include_bytes!("file_descriptor_set.bin").as_ref()).unwrap(); let message_descriptor = pool.get_message_by_name("package.MyMessage").unwrap(); let dynamic_message = DynamicMessage::decode(message_descriptor, b"\x08\x96\x01".as_ref()).unwrap(); assert_eq!(dynamic_message.get_field_by_name("foo").unwrap().as_ref(), &Value::I32(150)); ``` ### Example - JSON mapping When the `serde` feature is enabled, `DynamicMessage` can be deserialized to and from the [canonical JSON mapping](https://developers.google.com/protocol-buffers/docs/proto3#json) defined for protobuf messages. ```rust use prost::Message; use prost_reflect::{DynamicMessage, DescriptorPool, Value}; use serde_json::de::Deserializer; let pool = DescriptorPool::decode(include_bytes!("file_descriptor_set.bin").as_ref()).unwrap(); let message_descriptor = pool.get_message_by_name("package.MyMessage").unwrap(); let json = r#"{ "foo": 150 }"#; let mut deserializer = Deserializer::from_str(json); let dynamic_message = DynamicMessage::deserialize(message_descriptor, &mut deserializer).unwrap(); deserializer.end().unwrap(); assert_eq!(dynamic_message.get_field_by_name("foo").unwrap().as_ref(), &Value::I32(150)); ``` ### Example - implementing `ReflectMessage` The [`ReflectMessage`] trait provides a `.descriptor()` method to get type information for a message. It is implemented for `DynamicMessage` and the well-known-types provided by [`prost-types`](https://docs.rs/prost-types/0.10.0/prost_types). When the `derive` feature is enabled, it can be derived for [`Message`][prost::Message] implementations. The derive macro takes the following parameters: | Name | Value | |-----------------|-------| | descriptor_pool | An expression that resolves to a [`DescriptorPool`] containing the message type. The descriptor should be cached to avoid re-building it. Either this or `file_descriptor_pool_bytes` must be set | | file_descriptor_pool_bytes | An expression that resolves to an implementation of `Buf` containing an encoded file descriptor set. This will be automatically added to the global descriptor pool the first time `ReflectMessage::descriptor()` is called. | | message_name | The full name of the message, used to look it up within [`DescriptorPool`]. | ```rust use prost::Message; use prost_reflect::{DescriptorPool, ReflectMessage}; use once_cell::sync::Lazy; static DESCRIPTOR_POOL: Lazy = Lazy::new(|| DescriptorPool::decode(include_bytes!("file_descriptor_set.bin").as_ref()).unwrap()); #[derive(Message, ReflectMessage)] #[prost_reflect(descriptor_pool = "DESCRIPTOR_POOL", message_name = "package.MyMessage")] pub struct MyMessage {} let message = MyMessage {}; assert_eq!(message.descriptor().full_name(), "package.MyMessage"); ``` If you are using `prost-build`, the [`prost-reflect-build`](https://crates.io/crates/prost-reflect-build) crate provides helpers to generate `ReflectMessage` implementations: ```rust,no_run prost_reflect_build::Builder::new() .compile_protos(&["src/package.proto"], &["src"]) .unwrap(); ``` ## Minimum Supported Rust Version Rust **1.74** or higher. The minimum supported Rust version may be changed in the future, but it will be done with a minor version bump. ## License Licensed under either of * Apache License, Version 2.0 ([LICENSE-APACHE](LICENSE-APACHE) or http://www.apache.org/licenses/LICENSE-2.0) * MIT license ([LICENSE-MIT](LICENSE-MIT) or http://opensource.org/licenses/MIT) at your option. ## Contribution Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions. [`DescriptorPool`]: https://docs.rs/prost-reflect/0.15.0/prost_reflect/struct.DescriptorPool.html [`DynamicMessage`]: https://docs.rs/prost-reflect/0.15.0/prost_reflect/struct.DynamicMessage.html [`MessageDescriptor`]: https://docs.rs/prost-reflect/0.15.0/prost_reflect/struct.MessageDescriptor.html [`MessageDescriptor`]: https://docs.rs/prost-reflect/0.15.0/prost_reflect/struct.MessageDescriptor.html [`DynamicMessage::decode`]: https://docs.rs/prost-reflect/0.15.0/prost_reflect/struct.DynamicMessage.html#method.decode [`ReflectMessage`]: https://docs.rs/prost-reflect/0.15.0/prost_reflect/trait.ReflectMessage.html [`Default`]: https://doc.rust-lang.org/stable/core/default/trait.Default.html [prost::Message]: https://docs.rs/prost/latest/prost/trait.Message.html [prost_types::FileDescriptorSet]: https://docs.rs/prost-types/latest/prost_types/struct.FileDescriptorSet.html prost-reflect-derive-0.15.0/src/lib.rs000064400000000000000000000122501046102023000156570ustar 00000000000000//! This crate provides the [`ReflectMessage`](https://docs.rs/prost-reflect/latest/prost_reflect/derive.ReflectMessage.html) derive macro //! //! For documentation, see the example in the [`prost-reflect` crate docs](https://docs.rs/prost-reflect/latest/prost_reflect/index.html#deriving-reflectmessage). #![doc(html_root_url = "https://docs.rs/prost-reflect-derive/0.15.0/")] use proc_macro::TokenStream; use proc_macro2::Span; use quote::{quote, ToTokens}; use syn::spanned::Spanned; /// A derive macro for the [`ReflectMessage`](https://docs.rs/prost-reflect/latest/prost_reflect/trait.ReflectMessage.html) trait. /// /// For documentation, see the example in the [`prost-reflect` crate docs](https://docs.rs/prost-reflect/latest/prost_reflect/index.html#deriving-reflectmessage). #[proc_macro_derive(ReflectMessage, attributes(prost_reflect))] pub fn reflect_message(input: TokenStream) -> TokenStream { let input = syn::parse_macro_input!(input as syn::DeriveInput); match reflect_message_impl(input) { Ok(tokens) => tokens.into(), Err(err) => err.to_compile_error().into(), } } struct Args { args_span: Span, message_name: Option, descriptor_pool: Option, file_descriptor_set: Option, } fn reflect_message_impl(input: syn::DeriveInput) -> Result { match &input.data { syn::Data::Struct(_) => (), syn::Data::Enum(_) => return Ok(Default::default()), syn::Data::Union(_) => return Ok(Default::default()), }; let args = Args::parse(input.ident.span(), &input.attrs)?; let name = &input.ident; let descriptor_pool = args.descriptor_pool()?; let message_name = args.message_name()?; Ok(quote! { impl ::prost_reflect::ReflectMessage for #name { fn descriptor(&self) -> ::prost_reflect::MessageDescriptor { #descriptor_pool .get_message_by_name(#message_name) .expect(concat!("descriptor for message type `", #message_name, "` not found")) } } }) } fn is_prost_reflect_attribute(attr: &syn::Attribute) -> bool { attr.path().is_ident("prost_reflect") } impl Args { fn parse(input_span: proc_macro2::Span, attrs: &[syn::Attribute]) -> Result { let reflect_attrs: Vec<_> = attrs .iter() .filter(|attr| is_prost_reflect_attribute(attr)) .collect(); if reflect_attrs.is_empty() { return Err(syn::Error::new( input_span, "missing #[prost_reflect] attribute", )); } let mut args = Args { args_span: reflect_attrs .iter() .map(|a| a.span()) .reduce(|l, r| l.join(r).unwrap_or(l)) .unwrap(), message_name: None, descriptor_pool: None, file_descriptor_set: None, }; for attr in reflect_attrs { attr.parse_nested_meta(|nested| { if nested.path.is_ident("descriptor_pool") { args.descriptor_pool = nested.value()?.parse()?; Ok(()) } else if nested.path.is_ident("file_descriptor_set_bytes") { args.file_descriptor_set = nested.value()?.parse()?; Ok(()) } else if nested.path.is_ident("message_name") { args.message_name = nested.value()?.parse()?; Ok(()) } else { Err(syn::Error::new( nested.path.span(), "unknown argument (expected 'descriptor_pool', 'file_descriptor_set_bytes' or 'message_name')", )) } })?; } Ok(args) } fn descriptor_pool(&self) -> Result { if let Some(descriptor_pool) = &self.descriptor_pool { let expr: syn::Expr = syn::parse_str(&descriptor_pool.value())?; Ok(expr.to_token_stream()) } else if let Some(file_descriptor_set) = &self.file_descriptor_set { let expr: syn::Expr = syn::parse_str(&file_descriptor_set.value())?; Ok(quote!({ static INIT: ::std::sync::Once = ::std::sync::Once::new(); INIT.call_once(|| ::prost_reflect::DescriptorPool::decode_global_file_descriptor_set(#expr).unwrap()); ::prost_reflect::DescriptorPool::global() })) } else { Err(syn::Error::new( self.args_span, "missing required argument 'descriptor_pool'", )) } } fn message_name(&self) -> Result { if let Some(message_name) = &self.message_name { Ok(message_name.to_token_stream()) } else { Err(syn::Error::new( self.args_span, "missing required argument 'message_name'", )) } } }