From bc2475cf810ec13d00fa72e50cd2e50f5edeaadb Mon Sep 17 00:00:00 2001 From: Marco Neumann Date: Thu, 20 Nov 2025 16:27:47 +0100 Subject: [PATCH 1/2] chore: update Rust, fix clippy & build --- pbjson-build/src/generator/message.rs | 6 +++--- pbjson-build/src/lib.rs | 6 ++---- pbjson-build/src/message.rs | 8 ++++---- pbjson/src/lib.rs | 8 +++++--- rust-toolchain.toml | 2 +- 5 files changed, 15 insertions(+), 15 deletions(-) diff --git a/pbjson-build/src/generator/message.rs b/pbjson-build/src/generator/message.rs index 22e0f7d..467f095 100644 --- a/pbjson-build/src/generator/message.rs +++ b/pbjson-build/src/generator/message.rs @@ -89,7 +89,7 @@ fn write_field_empty_predicate( | (FieldType::Scalar(ScalarType::Bytes), FieldModifier::UseDefault) => { write!(writer, "!self.{}.is_empty()", member.rust_field_name()) } - (_, FieldModifier::Optional) | (FieldType::Message(_), _) => { + (_, FieldModifier::Optional) | (FieldType::Message, _) => { write!(writer, "self.{}.is_some()", member.rust_field_name()) } (FieldType::Scalar(ScalarType::F64), FieldModifier::UseDefault) @@ -877,7 +877,7 @@ fn write_deserialize_field( field.rust_type_name() )?; } - FieldType::Message(_) => writeln!( + FieldType::Message => writeln!( writer, "map_.next_value::<::std::option::Option<_>>()?.map({}::{})", resolver.rust_type(&one_of.path), @@ -983,7 +983,7 @@ fn write_deserialize_field( } write!(writer, "{})", Indent(indent + 1))?; } - FieldType::Message(_) => match field.field_modifier { + FieldType::Message => match field.field_modifier { FieldModifier::Repeated => { // No explicit presence for repeated fields write!(writer, "Some(map_.next_value()?)")?; diff --git a/pbjson-build/src/lib.rs b/pbjson-build/src/lib.rs index 912bbee..ce91cbd 100644 --- a/pbjson-build/src/lib.rs +++ b/pbjson-build/src/lib.rs @@ -80,7 +80,7 @@ )] use prost_types::FileDescriptorProto; -use std::io::{BufWriter, Error, ErrorKind, Result, Write}; +use std::io::{BufWriter, Error, Result, Write}; use std::path::PathBuf; use crate::descriptor::{Descriptor, Package}; @@ -205,9 +205,7 @@ impl Builder { pub fn build>(&mut self, prefixes: &[S]) -> Result<()> { let mut output: PathBuf = self.out_dir.clone().map(Ok).unwrap_or_else(|| { std::env::var_os("OUT_DIR") - .ok_or_else(|| { - Error::new(ErrorKind::Other, "OUT_DIR environment variable is not set") - }) + .ok_or_else(|| Error::other("OUT_DIR environment variable is not set")) .map(Into::into) })?; output.push("FILENAME"); diff --git a/pbjson-build/src/message.rs b/pbjson-build/src/message.rs index 6f0e47a..d21406a 100644 --- a/pbjson-build/src/message.rs +++ b/pbjson-build/src/message.rs @@ -52,7 +52,7 @@ impl ScalarType { pub enum FieldType { Scalar(ScalarType), Enum(TypePath), - Message(TypePath), + Message, Map(ScalarType, Box), } @@ -203,7 +203,7 @@ fn field_modifier( Label::Optional => match message.syntax { Syntax::Proto2 => FieldModifier::Optional, Syntax::Proto3 => match field_type { - FieldType::Message(_) => FieldModifier::Optional, + FieldType::Message => FieldModifier::Optional, _ => FieldModifier::UseDefault, }, }, @@ -245,7 +245,7 @@ fn resolve_type(descriptors: &DescriptorSet, type_name: &str) -> FieldType { match maybe_descriptor { Some((path, Descriptor::Enum(_))) => FieldType::Enum(path.clone()), - Some((path, Descriptor::Message(descriptor))) => match descriptor.is_map() { + Some((_path, Descriptor::Message(descriptor))) => match descriptor.is_map() { true => { assert_eq!(descriptor.fields.len(), 2, "expected map to have 2 fields"); let key = &descriptor.fields[0]; @@ -263,7 +263,7 @@ fn resolve_type(descriptors: &DescriptorSet, type_name: &str) -> FieldType { } // Note: This may actually be a group but it is non-trivial to detect this, // they're deprecated, and pbjson doesn't need to be able to distinguish - false => FieldType::Message(path.clone()), + false => FieldType::Message, }, None => panic!("failed to resolve type: {}", type_name), } diff --git a/pbjson/src/lib.rs b/pbjson/src/lib.rs index ea7828b..90de687 100644 --- a/pbjson/src/lib.rs +++ b/pbjson/src/lib.rs @@ -124,9 +124,11 @@ pub mod private { #[test] fn test_bytes() { for _ in 0..20 { - let mut rng = thread_rng(); - let len = rng.gen_range(50..100); - let raw: Vec<_> = std::iter::from_fn(|| Some(rng.gen())).take(len).collect(); + let mut rng = rand::rng(); + let len = rng.random_range(50..100); + let raw: Vec<_> = std::iter::from_fn(|| Some(rng.random())) + .take(len) + .collect(); for config in [ base64::engine::general_purpose::STANDARD, diff --git a/rust-toolchain.toml b/rust-toolchain.toml index ba3f7e4..ff79a41 100644 --- a/rust-toolchain.toml +++ b/rust-toolchain.toml @@ -1,3 +1,3 @@ [toolchain] -channel = "1.74" +channel = "1.91" components = ["rustfmt", "clippy"] From 15f738e2852e19b1c0f63abd7344192f4674b774 Mon Sep 17 00:00:00 2001 From: Marco Neumann Date: Thu, 20 Nov 2025 18:10:05 +0100 Subject: [PATCH 2/2] chore: regenerate descriptors.bin --- pbjson-types/descriptors.bin | Bin 134036 -> 136945 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/pbjson-types/descriptors.bin b/pbjson-types/descriptors.bin index c3b3ed27313f28474d61c081cbc454839f4b171f..1b0a47beb00b91946e8b3af1d5a402346d946788 100644 GIT binary patch delta 22299 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