From 7f1494e93d3761315c2b25c531e5a80cf9537d0f Mon Sep 17 00:00:00 2001 From: Techassi Date: Fri, 10 May 2024 10:16:14 +0200 Subject: [PATCH 01/11] feat(stackable-versioned): Improve action chain generation --- crates/stackable-versioned/CHANGELOG.md | 4 ++++ crates/stackable-versioned/src/gen/field.rs | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/crates/stackable-versioned/CHANGELOG.md b/crates/stackable-versioned/CHANGELOG.md index 87d9afb77..7a8f77168 100644 --- a/crates/stackable-versioned/CHANGELOG.md +++ b/crates/stackable-versioned/CHANGELOG.md @@ -4,6 +4,10 @@ All notable changes to this project will be documented in this file. ## [Unreleased] +- Improve action chain generation ([#CHANGEME]). + +[#CHANGEME](ttps://github.com/stackabletech/operator-rs/pull/CHANGEME) + ## [0.1.0] - 2024-05-08 ### Changed diff --git a/crates/stackable-versioned/src/gen/field.rs b/crates/stackable-versioned/src/gen/field.rs index 99ac9ecba..e8d4b0216 100644 --- a/crates/stackable-versioned/src/gen/field.rs +++ b/crates/stackable-versioned/src/gen/field.rs @@ -145,10 +145,10 @@ impl ToTokensExt for VersionedField { impl VersionedField { pub(crate) fn new(field: Field, attrs: FieldAttributes) -> Result { - // Constructing the change chain requires going through the actions from + // Constructing the action chain requires going through the actions from // the end, because the base struct always represents the latest (most // up-to-date) version of that struct. That's why the following code - // needs to go through the changes in reverse order, as otherwise it is + // needs to go through the actions in reverse order, as otherwise it is // impossible to extract the field ident for each version. // Deprecating a field is always the last state a field can end up in. For From 1f225b3d9828759ea9b24de5e99c9ebc4b770946 Mon Sep 17 00:00:00 2001 From: Techassi Date: Fri, 17 May 2024 16:02:35 +0200 Subject: [PATCH 02/11] Add Neighbor trait --- Cargo.lock | 1 + crates/stackable-versioned/Cargo.toml | 3 + crates/stackable-versioned/src/gen/mod.rs | 72 +++++++++++++++++++++++ 3 files changed, 76 insertions(+) diff --git a/Cargo.lock b/Cargo.lock index 03c1803bd..ae6da1d67 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2912,6 +2912,7 @@ dependencies = [ "k8s-version", "proc-macro2", "quote", + "rstest", "syn 2.0.61", ] diff --git a/crates/stackable-versioned/Cargo.toml b/crates/stackable-versioned/Cargo.toml index f19d35557..d2ff81b73 100644 --- a/crates/stackable-versioned/Cargo.toml +++ b/crates/stackable-versioned/Cargo.toml @@ -16,3 +16,6 @@ darling.workspace = true proc-macro2.workspace = true syn.workspace = true quote.workspace = true + +[dev-dependencies] +rstest.workspace = true diff --git a/crates/stackable-versioned/src/gen/mod.rs b/crates/stackable-versioned/src/gen/mod.rs index f95892882..016d9a7cb 100644 --- a/crates/stackable-versioned/src/gen/mod.rs +++ b/crates/stackable-versioned/src/gen/mod.rs @@ -1,3 +1,5 @@ +use std::{collections::BTreeMap, ops::Bound}; + use darling::FromDeriveInput; use proc_macro2::TokenStream; use quote::ToTokens; @@ -49,3 +51,73 @@ pub(crate) fn expand(input: DeriveInput) -> Result { pub(crate) trait ToTokensExt { fn to_tokens_for_version(&self, version: &ContainerVersion) -> Option; } + +pub(crate) trait Neighbors +where + K: Ord + Eq, +{ + fn get_neighbors(&self, key: &K) -> (Option<&V>, Option<&V>); + + fn lo_bound(&self, bound: Bound<&K>) -> Option<(&K, &V)>; + fn up_bound(&self, bound: Bound<&K>) -> Option<(&K, &V)>; +} + +impl Neighbors for BTreeMap +where + K: Ord + Eq, +{ + fn get_neighbors(&self, key: &K) -> (Option<&V>, Option<&V>) { + // NOTE (@Techassi): These functions might get added to the standard + // library at some point. If that's the case, we can use the ones + // provided by the standard lib. + // See: https://github.com/rust-lang/rust/issues/107540 + match ( + self.lo_bound(Bound::Excluded(key)), + self.up_bound(Bound::Excluded(key)), + ) { + (Some((k, v)), None) => { + if key > k { + (Some(v), None) + } else { + (self.lo_bound(Bound::Excluded(k)).map(|(_, v)| v), None) + } + } + (None, Some((k, v))) => { + if key < k { + (None, Some(v)) + } else { + (None, self.up_bound(Bound::Excluded(k)).map(|(_, v)| v)) + } + } + (Some((_, lo)), Some((_, up))) => (Some(lo), Some(up)), + (None, None) => unreachable!(), + } + } + + fn lo_bound(&self, bound: Bound<&K>) -> Option<(&K, &V)> { + self.range((Bound::Unbounded, bound)).next_back() + } + + fn up_bound(&self, bound: Bound<&K>) -> Option<(&K, &V)> { + self.range((bound, Bound::Unbounded)).next() + } +} + +#[cfg(test)] +mod test { + use super::*; + use rstest::rstest; + + #[rstest] + #[case(0, (None, Some(&"test1")))] + #[case(1, (None, Some(&"test3")))] + #[case(2, (Some(&"test1"), Some(&"test3")))] + #[case(3, (Some(&"test1"), None))] + #[case(4, (Some(&"test3"), None))] + fn test(#[case] key: i32, #[case] expected: (Option<&&str>, Option<&&str>)) { + let map = BTreeMap::from([(1, "test1"), (3, "test3")]); + let neigbors = map.get_neighbors(&key); + + assert_eq!(neigbors, expected); + } +} From 2cb53fe18aa7f28969ef112448d798111fff1f04 Mon Sep 17 00:00:00 2001 From: Techassi Date: Fri, 17 May 2024 16:03:53 +0200 Subject: [PATCH 03/11] Start to implement more robust version lookup --- crates/stackable-versioned/src/gen/field.rs | 135 ++++++------------ crates/stackable-versioned/src/gen/vstruct.rs | 25 ++-- 2 files changed, 54 insertions(+), 106 deletions(-) diff --git a/crates/stackable-versioned/src/gen/field.rs b/crates/stackable-versioned/src/gen/field.rs index e8d4b0216..b30468a67 100644 --- a/crates/stackable-versioned/src/gen/field.rs +++ b/crates/stackable-versioned/src/gen/field.rs @@ -9,7 +9,7 @@ use syn::{Field, Ident}; use crate::{ attrs::field::FieldAttributes, consts::DEPRECATED_PREFIX, - gen::{version::ContainerVersion, ToTokensExt}, + gen::{version::ContainerVersion, Neighbors, ToTokensExt}, }; /// A versioned field, which contains contains common [`Field`] data and a chain @@ -36,96 +36,24 @@ impl ToTokensExt for VersionedField { // The code generation then depends on the relation to other // versions (with actions). - // TODO (@Techassi): Make this more robust by also including - // the container versions in the action chain. I'm not happy - // with the follwoing code at all. It serves as a good first - // implementation to get something out of the door. - match chain.get(&container_version.inner) { - Some(action) => match action { - FieldStatus::Added(field_ident) => { - let field_type = &self.inner.ty; - - Some(quote! { - pub #field_ident: #field_type, - }) - } - FieldStatus::Renamed { from: _, to } => { - let field_type = &self.inner.ty; - - Some(quote! { - pub #to: #field_type, - }) - } - FieldStatus::Deprecated(field_ident) => { - let field_type = &self.inner.ty; - - Some(quote! { - #[deprecated] - pub #field_ident: #field_type, - }) - } - }, - None => { - // Generate field if the container version is not - // included in the action chain. First we check the - // earliest field action version. - if let Some((version, action)) = chain.first_key_value() { - if container_version.inner < *version { - match action { - FieldStatus::Added(_) => return None, - FieldStatus::Renamed { from, to: _ } => { - let field_type = &self.inner.ty; - - return Some(quote! { - pub #from: #field_type, - }); - } - FieldStatus::Deprecated(field_ident) => { - let field_type = &self.inner.ty; - - return Some(quote! { - pub #field_ident: #field_type, - }); - } - } - } - } - - // Check the container version against the latest - // field action version. - if let Some((version, action)) = chain.last_key_value() { - if container_version.inner > *version { - match action { - FieldStatus::Added(field_ident) => { - let field_type = &self.inner.ty; - - return Some(quote! { - pub #field_ident: #field_type, - }); - } - FieldStatus::Renamed { from: _, to } => { - let field_type = &self.inner.ty; - - return Some(quote! { - pub #to: #field_type, - }); - } - FieldStatus::Deprecated(field_ident) => { - let field_type = &self.inner.ty; - - return Some(quote! { - #[deprecated] - pub #field_ident: #field_type, - }); - } - } - } - } - - // TODO (@Techassi): Handle versions which are in between - // versions defined in field actions. - None - } + let field_type = &self.inner.ty; + + match chain + .get(&container_version.inner) + .expect("internal error: chain must contain container version") + { + FieldStatus::Added(field_ident) => Some(quote! { + pub #field_ident: #field_type, + }), + FieldStatus::Renamed { _from: _, to } => Some(quote! { + pub #to: #field_type, + }), + FieldStatus::Deprecated(field_ident) => Some(quote! { + #[deprecated] + pub #field_ident: #field_type, + }), + FieldStatus::NotPresent => None, + FieldStatus::NoChange => todo!(), } } None => { @@ -175,7 +103,7 @@ impl VersionedField { actions.insert( *rename.since, FieldStatus::Renamed { - from: from.clone(), + _from: from.clone(), to: ident, }, ); @@ -201,7 +129,7 @@ impl VersionedField { actions.insert( *rename.since, FieldStatus::Renamed { - from: from.clone(), + _from: from.clone(), to: ident, }, ); @@ -241,11 +169,30 @@ impl VersionedField { }) } } + + pub(crate) fn insert_container_versions(&mut self, versions: &Vec) { + if let Some(chain) = &mut self.chain { + for version in versions { + if chain.contains_key(&version.inner) { + continue; + } + + match chain.get_neighbors(&version.inner) { + (None, Some(_)) => chain.insert(version.inner, FieldStatus::NotPresent), + (Some(_), None) => chain.insert(version.inner, FieldStatus::NoChange), + (Some(_), Some(_)) => chain.insert(version.inner, FieldStatus::NoChange), + _ => unreachable!(), + }; + } + } + } } #[derive(Debug)] pub(crate) enum FieldStatus { Added(Ident), - Renamed { from: Ident, to: Ident }, + Renamed { _from: Ident, to: Ident }, Deprecated(Ident), + NoChange, + NotPresent, } diff --git a/crates/stackable-versioned/src/gen/vstruct.rs b/crates/stackable-versioned/src/gen/vstruct.rs index 7f829d323..f92587419 100644 --- a/crates/stackable-versioned/src/gen/vstruct.rs +++ b/crates/stackable-versioned/src/gen/vstruct.rs @@ -70,29 +70,30 @@ impl VersionedStruct { data: DataStruct, attributes: ContainerAttributes, ) -> Result { - let mut fields = Vec::new(); + // Convert the raw version attributes into a container version. + let versions = attributes + .versions + .iter() + .map(|v| ContainerVersion { + deprecated: v.deprecated.is_present(), + inner: v.name, + }) + .collect(); // Extract the field attributes for every field from the raw token // stream and also validate that each field action version uses a // version declared by the container attribute. + let mut fields = Vec::new(); + for field in data.fields { let attrs = FieldAttributes::from_field(&field)?; attrs.validate_versions(&attributes, &field)?; - let versioned_field = VersionedField::new(field, attrs)?; + let mut versioned_field = VersionedField::new(field, attrs)?; + versioned_field.insert_container_versions(&versions); fields.push(versioned_field); } - // Convert the raw version attributes into a container version. - let versions = attributes - .versions - .iter() - .map(|v| ContainerVersion { - deprecated: v.deprecated.is_present(), - inner: v.name, - }) - .collect(); - Ok(Self { ident, versions, From 856c6a17a0a65d3453b115e84c8daa553e888e67 Mon Sep 17 00:00:00 2001 From: Techassi Date: Tue, 21 May 2024 12:26:52 +0200 Subject: [PATCH 04/11] Finish version lookup --- crates/stackable-versioned/src/attrs/field.rs | 2 +- crates/stackable-versioned/src/gen/field.rs | 60 ++++++++++++++++--- crates/stackable-versioned/tests/basic.rs | 6 +- 3 files changed, 57 insertions(+), 11 deletions(-) diff --git a/crates/stackable-versioned/src/attrs/field.rs b/crates/stackable-versioned/src/attrs/field.rs index c42ad0783..b6f6ce166 100644 --- a/crates/stackable-versioned/src/attrs/field.rs +++ b/crates/stackable-versioned/src/attrs/field.rs @@ -51,7 +51,7 @@ pub(crate) struct RenamedAttributes { #[derive(Clone, Debug, FromMeta)] pub(crate) struct DeprecatedAttributes { pub(crate) since: SpannedValue, - pub(crate) _note: SpannedValue, + pub(crate) note: SpannedValue, } impl FieldAttributes { diff --git a/crates/stackable-versioned/src/gen/field.rs b/crates/stackable-versioned/src/gen/field.rs index b30468a67..facf35573 100644 --- a/crates/stackable-versioned/src/gen/field.rs +++ b/crates/stackable-versioned/src/gen/field.rs @@ -48,12 +48,17 @@ impl ToTokensExt for VersionedField { FieldStatus::Renamed { _from: _, to } => Some(quote! { pub #to: #field_type, }), - FieldStatus::Deprecated(field_ident) => Some(quote! { - #[deprecated] + FieldStatus::Deprecated { + ident: field_ident, + note, + } => Some(quote! { + #[deprecated = #note] pub #field_ident: #field_type, }), FieldStatus::NotPresent => None, - FieldStatus::NoChange => todo!(), + FieldStatus::NoChange(field_ident) => Some(quote! { + pub #field_ident: #field_type, + }), } } None => { @@ -72,6 +77,11 @@ impl ToTokensExt for VersionedField { } impl VersionedField { + /// Create a new versioned field by creating a status chain for each version + /// defined in an action in the field attribute. + /// + /// This chain will get extended by the versions defined on the container by + /// calling the [`VersionedField::insert_container_versions`] function. pub(crate) fn new(field: Field, attrs: FieldAttributes) -> Result { // Constructing the action chain requires going through the actions from // the end, because the base struct always represents the latest (most @@ -88,7 +98,13 @@ impl VersionedField { let mut actions = BTreeMap::new(); let ident = field.ident.as_ref().unwrap(); - actions.insert(*deprecated.since, FieldStatus::Deprecated(ident.clone())); + actions.insert( + *deprecated.since, + FieldStatus::Deprecated { + ident: ident.clone(), + note: deprecated.note.to_string(), + }, + ); // When the field is deprecated, any rename which occured beforehand // requires access to the field ident to infer the field ident for @@ -170,6 +186,15 @@ impl VersionedField { } } + /// Inserts container versions not yet present in the status chain. + /// + /// When intially creating a new [`VersionedField`], the code doesn't have + /// access to the versions defined on the container. This function inserts + /// all non-present container versions and decides which status and ident + /// is the right fit based on the status neighbors. + /// + /// This continous chain ensures that when generating code (tokens), each + /// field can lookup the status for a requested version. pub(crate) fn insert_container_versions(&mut self, versions: &Vec) { if let Some(chain) = &mut self.chain { for version in versions { @@ -179,8 +204,27 @@ impl VersionedField { match chain.get_neighbors(&version.inner) { (None, Some(_)) => chain.insert(version.inner, FieldStatus::NotPresent), - (Some(_), None) => chain.insert(version.inner, FieldStatus::NoChange), - (Some(_), Some(_)) => chain.insert(version.inner, FieldStatus::NoChange), + (Some(status), None) => { + let ident = match status { + FieldStatus::Added(ident) => ident, + FieldStatus::Renamed { _from: _, to } => to, + FieldStatus::Deprecated { ident, note: _ } => ident, + FieldStatus::NoChange(ident) => ident, + FieldStatus::NotPresent => unreachable!(), + }; + + chain.insert(version.inner, FieldStatus::NoChange(ident.clone())) + } + (Some(status), Some(_)) => { + let ident = match status { + FieldStatus::Added(ident) => ident, + FieldStatus::Renamed { _from: _, to } => to, + FieldStatus::NoChange(ident) => ident, + _ => unreachable!(), + }; + + chain.insert(version.inner, FieldStatus::NoChange(ident.clone())) + } _ => unreachable!(), }; } @@ -192,7 +236,7 @@ impl VersionedField { pub(crate) enum FieldStatus { Added(Ident), Renamed { _from: Ident, to: Ident }, - Deprecated(Ident), - NoChange, + Deprecated { ident: Ident, note: String }, + NoChange(Ident), NotPresent, } diff --git a/crates/stackable-versioned/tests/basic.rs b/crates/stackable-versioned/tests/basic.rs index 6cfa11c23..f49b7c5d2 100644 --- a/crates/stackable-versioned/tests/basic.rs +++ b/crates/stackable-versioned/tests/basic.rs @@ -5,14 +5,16 @@ use stackable_versioned::Versioned; #[versioned( version(name = "v1alpha1"), version(name = "v1beta1"), - version(name = "v1") + version(name = "v1"), + version(name = "v2"), + version(name = "v3") )] struct Foo { /// My docs #[versioned( added(since = "v1alpha1"), renamed(since = "v1beta1", from = "jjj"), - deprecated(since = "v1", _note = "") + deprecated(since = "v2", note = "") )] deprecated_bar: usize, baz: bool, From d1687c7691de14d944c54ac7eb7ae7f8359390ac Mon Sep 17 00:00:00 2001 From: Techassi Date: Tue, 21 May 2024 13:01:18 +0200 Subject: [PATCH 05/11] Add deprecation note validation --- crates/stackable-versioned/src/attrs/field.rs | 17 +++++++++++++++++ crates/stackable-versioned/tests/basic.rs | 2 +- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/crates/stackable-versioned/src/attrs/field.rs b/crates/stackable-versioned/src/attrs/field.rs index b6f6ce166..9368782e2 100644 --- a/crates/stackable-versioned/src/attrs/field.rs +++ b/crates/stackable-versioned/src/attrs/field.rs @@ -64,10 +64,14 @@ impl FieldAttributes { fn validate(self) -> Result { let mut errors = Error::accumulator(); + // Semantic validation errors.handle(self.validate_action_combinations()); errors.handle(self.validate_action_order()); errors.handle(self.validate_field_name()); + // Code quality validation + errors.handle(self.validate_deprecated_options()); + // TODO (@Techassi): Add validation for renames so that renamed fields // match up and form a continous chain (eg. foo -> bar -> baz). @@ -191,6 +195,19 @@ impl FieldAttributes { Ok(()) } + fn validate_deprecated_options(&self) -> Result<(), Error> { + // TODO (@Techassi): Make note optional + + if let Some(deprecated) = &self.deprecated { + if deprecated.note.is_empty() { + return Err(Error::custom("deprecation note must not be empty") + .with_span(&deprecated.note.span())); + } + } + + Ok(()) + } + /// Validates that each field action version is present in the declared /// container versions. pub(crate) fn validate_versions( diff --git a/crates/stackable-versioned/tests/basic.rs b/crates/stackable-versioned/tests/basic.rs index f49b7c5d2..c546c0fd8 100644 --- a/crates/stackable-versioned/tests/basic.rs +++ b/crates/stackable-versioned/tests/basic.rs @@ -14,7 +14,7 @@ struct Foo { #[versioned( added(since = "v1alpha1"), renamed(since = "v1beta1", from = "jjj"), - deprecated(since = "v2", note = "") + deprecated(since = "v2", note = "not empty") )] deprecated_bar: usize, baz: bool, From 2a31d73ef16412e054d46ea42d3f93564f231072 Mon Sep 17 00:00:00 2001 From: Techassi Date: Tue, 21 May 2024 13:57:07 +0200 Subject: [PATCH 06/11] Update PR links in changelog --- crates/stackable-versioned/CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/stackable-versioned/CHANGELOG.md b/crates/stackable-versioned/CHANGELOG.md index 7a8f77168..1a6441cdf 100644 --- a/crates/stackable-versioned/CHANGELOG.md +++ b/crates/stackable-versioned/CHANGELOG.md @@ -4,9 +4,9 @@ All notable changes to this project will be documented in this file. ## [Unreleased] -- Improve action chain generation ([#CHANGEME]). +- Improve action chain generation ([#764]). -[#CHANGEME](ttps://github.com/stackabletech/operator-rs/pull/CHANGEME) +[#764](ttps://github.com/stackabletech/operator-rs/pull/764) ## [0.1.0] - 2024-05-08 From 974f694fa5cb0e51592b5b42109cdc244844d120 Mon Sep 17 00:00:00 2001 From: Techassi Date: Tue, 21 May 2024 14:02:34 +0200 Subject: [PATCH 07/11] Fix PR number in changelog link --- crates/stackable-versioned/CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/stackable-versioned/CHANGELOG.md b/crates/stackable-versioned/CHANGELOG.md index 1a6441cdf..fa261cf80 100644 --- a/crates/stackable-versioned/CHANGELOG.md +++ b/crates/stackable-versioned/CHANGELOG.md @@ -4,9 +4,9 @@ All notable changes to this project will be documented in this file. ## [Unreleased] -- Improve action chain generation ([#764]). +- Improve action chain generation ([#784]). -[#764](ttps://github.com/stackabletech/operator-rs/pull/764) +[#784](ttps://github.com/stackabletech/operator-rs/pull/784) ## [0.1.0] - 2024-05-08 From f862c5094ab5f333aca8e84923ca80e5c380efde Mon Sep 17 00:00:00 2001 From: Techassi Date: Wed, 22 May 2024 14:52:52 +0200 Subject: [PATCH 08/11] Adjust TODO about optional deprecation note --- crates/stackable-versioned/src/attrs/field.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/crates/stackable-versioned/src/attrs/field.rs b/crates/stackable-versioned/src/attrs/field.rs index 9368782e2..24f65a11e 100644 --- a/crates/stackable-versioned/src/attrs/field.rs +++ b/crates/stackable-versioned/src/attrs/field.rs @@ -196,7 +196,10 @@ impl FieldAttributes { } fn validate_deprecated_options(&self) -> Result<(), Error> { - // TODO (@Techassi): Make note optional + // TODO (@Techassi): Make the field 'note' optional, because in the + // future, the macro will generate parts of the deprecation note + // automatically. The user-provided note will then be appended to the + // auto-generated one. if let Some(deprecated) = &self.deprecated { if deprecated.note.is_empty() { From 89eced5735aa5b306cad87dfe444e785ea9579fd Mon Sep 17 00:00:00 2001 From: Techassi Date: Wed, 22 May 2024 14:53:53 +0200 Subject: [PATCH 09/11] Move neighbor code into own file --- crates/stackable-versioned/src/gen/field.rs | 2 +- crates/stackable-versioned/src/gen/mod.rs | 73 +------------------ .../stackable-versioned/src/gen/neighbors.rs | 71 ++++++++++++++++++ 3 files changed, 73 insertions(+), 73 deletions(-) create mode 100644 crates/stackable-versioned/src/gen/neighbors.rs diff --git a/crates/stackable-versioned/src/gen/field.rs b/crates/stackable-versioned/src/gen/field.rs index facf35573..e6948310b 100644 --- a/crates/stackable-versioned/src/gen/field.rs +++ b/crates/stackable-versioned/src/gen/field.rs @@ -9,7 +9,7 @@ use syn::{Field, Ident}; use crate::{ attrs::field::FieldAttributes, consts::DEPRECATED_PREFIX, - gen::{version::ContainerVersion, Neighbors, ToTokensExt}, + gen::{neighbors::Neighbors, version::ContainerVersion, ToTokensExt}, }; /// A versioned field, which contains contains common [`Field`] data and a chain diff --git a/crates/stackable-versioned/src/gen/mod.rs b/crates/stackable-versioned/src/gen/mod.rs index 016d9a7cb..4c3729873 100644 --- a/crates/stackable-versioned/src/gen/mod.rs +++ b/crates/stackable-versioned/src/gen/mod.rs @@ -1,5 +1,3 @@ -use std::{collections::BTreeMap, ops::Bound}; - use darling::FromDeriveInput; use proc_macro2::TokenStream; use quote::ToTokens; @@ -11,6 +9,7 @@ use crate::{ }; pub(crate) mod field; +pub(crate) mod neighbors; pub(crate) mod venum; pub(crate) mod version; pub(crate) mod vstruct; @@ -51,73 +50,3 @@ pub(crate) fn expand(input: DeriveInput) -> Result { pub(crate) trait ToTokensExt { fn to_tokens_for_version(&self, version: &ContainerVersion) -> Option; } - -pub(crate) trait Neighbors -where - K: Ord + Eq, -{ - fn get_neighbors(&self, key: &K) -> (Option<&V>, Option<&V>); - - fn lo_bound(&self, bound: Bound<&K>) -> Option<(&K, &V)>; - fn up_bound(&self, bound: Bound<&K>) -> Option<(&K, &V)>; -} - -impl Neighbors for BTreeMap -where - K: Ord + Eq, -{ - fn get_neighbors(&self, key: &K) -> (Option<&V>, Option<&V>) { - // NOTE (@Techassi): These functions might get added to the standard - // library at some point. If that's the case, we can use the ones - // provided by the standard lib. - // See: https://github.com/rust-lang/rust/issues/107540 - match ( - self.lo_bound(Bound::Excluded(key)), - self.up_bound(Bound::Excluded(key)), - ) { - (Some((k, v)), None) => { - if key > k { - (Some(v), None) - } else { - (self.lo_bound(Bound::Excluded(k)).map(|(_, v)| v), None) - } - } - (None, Some((k, v))) => { - if key < k { - (None, Some(v)) - } else { - (None, self.up_bound(Bound::Excluded(k)).map(|(_, v)| v)) - } - } - (Some((_, lo)), Some((_, up))) => (Some(lo), Some(up)), - (None, None) => unreachable!(), - } - } - - fn lo_bound(&self, bound: Bound<&K>) -> Option<(&K, &V)> { - self.range((Bound::Unbounded, bound)).next_back() - } - - fn up_bound(&self, bound: Bound<&K>) -> Option<(&K, &V)> { - self.range((bound, Bound::Unbounded)).next() - } -} - -#[cfg(test)] -mod test { - use super::*; - use rstest::rstest; - - #[rstest] - #[case(0, (None, Some(&"test1")))] - #[case(1, (None, Some(&"test3")))] - #[case(2, (Some(&"test1"), Some(&"test3")))] - #[case(3, (Some(&"test1"), None))] - #[case(4, (Some(&"test3"), None))] - fn test(#[case] key: i32, #[case] expected: (Option<&&str>, Option<&&str>)) { - let map = BTreeMap::from([(1, "test1"), (3, "test3")]); - let neigbors = map.get_neighbors(&key); - - assert_eq!(neigbors, expected); - } -} diff --git a/crates/stackable-versioned/src/gen/neighbors.rs b/crates/stackable-versioned/src/gen/neighbors.rs new file mode 100644 index 000000000..c37955a39 --- /dev/null +++ b/crates/stackable-versioned/src/gen/neighbors.rs @@ -0,0 +1,71 @@ +use std::{collections::BTreeMap, ops::Bound}; + +pub(crate) trait Neighbors +where + K: Ord + Eq, +{ + fn get_neighbors(&self, key: &K) -> (Option<&V>, Option<&V>); + + fn lo_bound(&self, bound: Bound<&K>) -> Option<(&K, &V)>; + fn up_bound(&self, bound: Bound<&K>) -> Option<(&K, &V)>; +} + +impl Neighbors for BTreeMap +where + K: Ord + Eq, +{ + fn get_neighbors(&self, key: &K) -> (Option<&V>, Option<&V>) { + // NOTE (@Techassi): These functions might get added to the standard + // library at some point. If that's the case, we can use the ones + // provided by the standard lib. + // See: https://github.com/rust-lang/rust/issues/107540 + match ( + self.lo_bound(Bound::Excluded(key)), + self.up_bound(Bound::Excluded(key)), + ) { + (Some((k, v)), None) => { + if key > k { + (Some(v), None) + } else { + (self.lo_bound(Bound::Excluded(k)).map(|(_, v)| v), None) + } + } + (None, Some((k, v))) => { + if key < k { + (None, Some(v)) + } else { + (None, self.up_bound(Bound::Excluded(k)).map(|(_, v)| v)) + } + } + (Some((_, lo)), Some((_, up))) => (Some(lo), Some(up)), + (None, None) => unreachable!(), + } + } + + fn lo_bound(&self, bound: Bound<&K>) -> Option<(&K, &V)> { + self.range((Bound::Unbounded, bound)).next_back() + } + + fn up_bound(&self, bound: Bound<&K>) -> Option<(&K, &V)> { + self.range((bound, Bound::Unbounded)).next() + } +} + +#[cfg(test)] +mod test { + use super::*; + use rstest::rstest; + + #[rstest] + #[case(0, (None, Some(&"test1")))] + #[case(1, (None, Some(&"test3")))] + #[case(2, (Some(&"test1"), Some(&"test3")))] + #[case(3, (Some(&"test1"), None))] + #[case(4, (Some(&"test3"), None))] + fn test(#[case] key: i32, #[case] expected: (Option<&&str>, Option<&&str>)) { + let map = BTreeMap::from([(1, "test1"), (3, "test3")]); + let neigbors = map.get_neighbors(&key); + + assert_eq!(neigbors, expected); + } +} From 6d5ab169e532cff4e4f7706634f5e8e766ee77e4 Mon Sep 17 00:00:00 2001 From: Techassi Date: Wed, 22 May 2024 14:54:10 +0200 Subject: [PATCH 10/11] Add comment on how to expand generated code --- crates/stackable-versioned/tests/basic.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/crates/stackable-versioned/tests/basic.rs b/crates/stackable-versioned/tests/basic.rs index c546c0fd8..6f952c618 100644 --- a/crates/stackable-versioned/tests/basic.rs +++ b/crates/stackable-versioned/tests/basic.rs @@ -1,5 +1,8 @@ use stackable_versioned::Versioned; +// To expand the generated code (for debugging and testing), it is recommended +// to first change directory via `cd crates/stackable-versioned` and to then +// run `cargo expand --test basic --all-features`. #[derive(Versioned)] #[allow(dead_code)] #[versioned( From 871cc7734b119f3452acfc5f90415fb2f2de4b3f Mon Sep 17 00:00:00 2001 From: Techassi Date: Wed, 22 May 2024 14:57:32 +0200 Subject: [PATCH 11/11] Update Cargo.lock file --- Cargo.lock | 196 ++++++++++++++++++++++++++--------------------------- 1 file changed, 98 insertions(+), 98 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ae6da1d67..9f55a565f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -96,9 +96,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.83" +version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25bdb32cbbdce2b519a9cd7df3a678443100e265d5e25ca763b7572a5104f5f3" +checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" [[package]] name = "async-broadcast" @@ -131,7 +131,7 @@ checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ "proc-macro2", "quote", - "syn 2.0.61", + "syn 2.0.65", ] [[package]] @@ -142,9 +142,15 @@ checksum = "c6fa2087f2753a7da8cc1c0dbfcf89579dd57458e36769de5ac750b4671737ca" dependencies = [ "proc-macro2", "quote", - "syn 2.0.61", + "syn 2.0.65", ] +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + [[package]] name = "autocfg" version = "1.3.0" @@ -347,7 +353,7 @@ dependencies = [ "regex", "rustc-hash", "shlex", - "syn 2.0.61", + "syn 2.0.65", "which", ] @@ -407,9 +413,9 @@ checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" [[package]] name = "cc" -version = "1.0.97" +version = "1.0.98" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "099a5357d84c4c61eb35fc8eafa9a79a902c2f76911e5747ced4e032edd8d9b4" +checksum = "41c270e7540d725e65ac7f1b212ac8ce349719624d7bcff99f8e2e488e8cf03f" dependencies = [ "jobserver", "libc", @@ -471,7 +477,7 @@ dependencies = [ "anstream", "anstyle", "clap_lex", - "strsim 0.11.1", + "strsim", ] [[package]] @@ -483,7 +489,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.61", + "syn 2.0.65", ] [[package]] @@ -569,27 +575,27 @@ dependencies = [ [[package]] name = "crc32fast" -version = "1.4.0" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3855a8a784b474f333699ef2bbca9db2c4a1f6d9088a90a2d25b1eb53111eaa" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" dependencies = [ "cfg-if", ] [[package]] name = "crossbeam-channel" -version = "0.5.12" +version = "0.5.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab3db02a9c5b5121e1e42fbdb1aeb65f5e02624cc58c43f2884c6ccac0b82f95" +checksum = "33480d6946193aa8033910124896ca395333cae7e2d1113d1fef6c3272217df2" dependencies = [ "crossbeam-utils", ] [[package]] name = "crossbeam-utils" -version = "0.8.19" +version = "0.8.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" +checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" [[package]] name = "crypto-bigint" @@ -615,9 +621,9 @@ dependencies = [ [[package]] name = "darling" -version = "0.20.8" +version = "0.20.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54e36fcd13ed84ffdfda6f5be89b31287cbb80c439841fe69e04841435464391" +checksum = "83b2eb4d90d12bdda5ed17de686c2acb4c57914f8f921b8da7e112b5a36f3fe1" dependencies = [ "darling_core", "darling_macro", @@ -625,27 +631,27 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.20.8" +version = "0.20.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c2cf1c23a687a1feeb728783b993c4e1ad83d99f351801977dd809b48d0a70f" +checksum = "622687fe0bac72a04e5599029151f5796111b90f1baaa9b544d807a5e31cd120" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", - "strsim 0.10.0", - "syn 2.0.61", + "strsim", + "syn 2.0.65", ] [[package]] name = "darling_macro" -version = "0.20.8" +version = "0.20.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a668eda54683121533a393014d8692171709ff57a7d61f187b6e782719f8933f" +checksum = "733cabb43482b1a1b53eee8583c2b9e8684d592215ea83efd305dd31bc2f0178" dependencies = [ "darling_core", "quote", - "syn 2.0.61", + "syn 2.0.65", ] [[package]] @@ -656,7 +662,7 @@ checksum = "4e018fccbeeb50ff26562ece792ed06659b9c2dae79ece77c4456bb10d9bf79b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.61", + "syn 2.0.65", ] [[package]] @@ -680,7 +686,7 @@ checksum = "5fe87ce4529967e0ba1dcf8450bab64d97dfd5010a6256187ffe2e43e6f0e049" dependencies = [ "proc-macro2", "quote", - "syn 2.0.61", + "syn 2.0.65", ] [[package]] @@ -763,9 +769,9 @@ dependencies = [ [[package]] name = "either" -version = "1.11.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a47c1c47d2f5964e29c61246e81db715514cd532db6b5116a25ea3c03d6780a2" +checksum = "3dca9240753cf90908d7e4aac30f630662b02aebaa1b58a3cadabdb23385b58b" [[package]] name = "elliptic-curve" @@ -961,7 +967,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.61", + "syn 2.0.65", ] [[package]] @@ -1066,15 +1072,15 @@ dependencies = [ [[package]] name = "h2" -version = "0.4.4" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "816ec7294445779408f36fe57bc5b7fc1cf59664059096c65f905c1c61f58069" +checksum = "fa82e28a107a8cc405f0839610bdc9b15f1e25ec7d696aa5cf173edbcb1486ab" dependencies = [ + "atomic-waker", "bytes", "fnv", "futures-core", "futures-sink", - "futures-util", "http 1.1.0", "indexmap 2.2.6", "slab", @@ -1236,7 +1242,7 @@ dependencies = [ "bytes", "futures-channel", "futures-util", - "h2 0.4.4", + "h2 0.4.5", "http 1.1.0", "http-body 1.0.0", "httparse", @@ -1350,9 +1356,9 @@ dependencies = [ [[package]] name = "instant" -version = "0.1.12" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" dependencies = [ "cfg-if", ] @@ -1465,7 +1471,7 @@ dependencies = [ "rstest", "rstest_reuse", "snafu 0.8.2", - "syn 2.0.61", + "syn 2.0.65", ] [[package]] @@ -1545,7 +1551,7 @@ dependencies = [ "proc-macro2", "quote", "serde_json", - "syn 2.0.61", + "syn 2.0.65", ] [[package]] @@ -1593,9 +1599,9 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "libc" -version = "0.2.154" +version = "0.2.155" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae743338b92ff9146ce83992f766a31066a91a8c84a45e0e9f21e7cf6de6d346" +checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" [[package]] name = "libloading" @@ -1615,9 +1621,9 @@ checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" [[package]] name = "linux-raw-sys" -version = "0.4.13" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" +checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" [[package]] name = "lock_api" @@ -1670,9 +1676,9 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7" +checksum = "87dfd01fe195c66b572b37921ad8803d010623c0aca821bea2302239d155cdae" dependencies = [ "adler", ] @@ -2030,7 +2036,7 @@ dependencies = [ "pest_meta", "proc-macro2", "quote", - "syn 2.0.61", + "syn 2.0.65", ] [[package]] @@ -2061,7 +2067,7 @@ checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" dependencies = [ "proc-macro2", "quote", - "syn 2.0.61", + "syn 2.0.65", ] [[package]] @@ -2116,7 +2122,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f12335488a2f3b0a83b14edad48dca9879ce89b2edd10e80237e4e852dd645e" dependencies = [ "proc-macro2", - "syn 2.0.61", + "syn 2.0.65", ] [[package]] @@ -2130,9 +2136,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.82" +version = "1.0.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ad3d49ab951a01fbaafe34f2ec74122942fe18a3f9814c3268f1bb72042131b" +checksum = "0b33eb56c327dec362a9e55b3ad14f9d2f0904fb5a5b03b513ab5465399e9f43" dependencies = [ "unicode-ident", ] @@ -2155,9 +2161,9 @@ dependencies = [ [[package]] name = "prost" -version = "0.12.4" +version = "0.12.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0f5d036824e4761737860779c906171497f6d55681139d8312388f8fe398922" +checksum = "deb1435c188b76130da55f17a466d252ff7b1418b2ad3e037d127b94e3411f29" dependencies = [ "bytes", "prost-derive", @@ -2165,15 +2171,15 @@ dependencies = [ [[package]] name = "prost-derive" -version = "0.12.5" +version = "0.12.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9554e3ab233f0a932403704f1a1d08c30d5ccd931adfdfa1e8b5a19b52c1d55a" +checksum = "81bddcdb20abf9501610992b6759a4c888aef7d1a7247ef75e2404275ac24af1" dependencies = [ "anyhow", "itertools", "proc-macro2", "quote", - "syn 2.0.61", + "syn 2.0.65", ] [[package]] @@ -2345,7 +2351,7 @@ dependencies = [ "regex", "relative-path", "rustc_version", - "syn 2.0.61", + "syn 2.0.65", "unicode-ident", ] @@ -2358,7 +2364,7 @@ dependencies = [ "quote", "rand", "rustc_version", - "syn 2.0.61", + "syn 2.0.65", ] [[package]] @@ -2397,9 +2403,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.5" +version = "0.23.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afabcee0551bd1aa3e18e5adbf2c0544722014b899adb31bd186ec638d3da97e" +checksum = "ebbbdb961df0ad3f2652da8f3fdc4b36122f568f968f45ad3316f26c025c677b" dependencies = [ "aws-lc-rs", "log", @@ -2442,9 +2448,9 @@ checksum = "976295e77ce332211c0d24d92c0e83e50f5c5f046d11082cea19f3df13a3562d" [[package]] name = "rustls-webpki" -version = "0.102.3" +version = "0.102.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3bce581c0dd41bce533ce695a1437fa16a7ab5ac3ccfa99fe1a620a7885eabf" +checksum = "ff448f7e92e913c4b7d4c6d8e4540a1724b319b4152b8aef6d4cf8339712b33e" dependencies = [ "aws-lc-rs", "ring", @@ -2454,9 +2460,9 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.16" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "092474d1a01ea8278f69e6a358998405fae5b8b963ddaeb2b0b04a128bf1dfb0" +checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" [[package]] name = "ryu" @@ -2475,9 +2481,9 @@ dependencies = [ [[package]] name = "schemars" -version = "0.8.19" +version = "0.8.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc6e7ed6919cb46507fb01ff1654309219f62b4d603822501b0b80d42f6f21ef" +checksum = "b0218ceea14babe24a4a5836f86ade86c1effbc198164e619194cb5069187e29" dependencies = [ "dyn-clone", "schemars_derive", @@ -2488,14 +2494,14 @@ dependencies = [ [[package]] name = "schemars_derive" -version = "0.8.19" +version = "0.8.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "185f2b7aa7e02d418e453790dde16890256bbd2bcd04b7dc5348811052b53f49" +checksum = "3ed5a1ccce8ff962e31a165d41f6e2a2dd1245099dc4d594f5574a86cd90f4d3" dependencies = [ "proc-macro2", "quote", "serde_derive_internals", - "syn 2.0.61", + "syn 2.0.65", ] [[package]] @@ -2559,9 +2565,9 @@ checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" [[package]] name = "serde" -version = "1.0.201" +version = "1.0.202" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "780f1cebed1629e4753a1a38a3c72d30b97ec044f0aef68cb26650a3c5cf363c" +checksum = "226b61a0d411b2ba5ff6d7f73a476ac4f8bb900373459cd00fab8512828ba395" dependencies = [ "serde_derive", ] @@ -2578,24 +2584,24 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.201" +version = "1.0.202" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5e405930b9796f1c00bee880d03fc7e0bb4b9a11afc776885ffe84320da2865" +checksum = "6048858004bcff69094cd972ed40a32500f153bd3be9f716b2eed2e8217c4838" dependencies = [ "proc-macro2", "quote", - "syn 2.0.61", + "syn 2.0.65", ] [[package]] name = "serde_derive_internals" -version = "0.29.0" +version = "0.29.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "330f01ce65a3a5fe59a60c82f3c9a024b573b8a6e875bd233fe5f934e71d54e3" +checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" dependencies = [ "proc-macro2", "quote", - "syn 2.0.61", + "syn 2.0.65", ] [[package]] @@ -2776,7 +2782,7 @@ dependencies = [ "heck 0.4.1", "proc-macro2", "quote", - "syn 2.0.61", + "syn 2.0.65", ] [[package]] @@ -2880,7 +2886,7 @@ dependencies = [ "proc-macro2", "quote", "stackable-operator", - "syn 2.0.61", + "syn 2.0.65", ] [[package]] @@ -2913,7 +2919,7 @@ dependencies = [ "proc-macro2", "quote", "rstest", - "syn 2.0.61", + "syn 2.0.65", ] [[package]] @@ -2938,12 +2944,6 @@ dependencies = [ "tracing", ] -[[package]] -name = "strsim" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" - [[package]] name = "strsim" version = "0.11.1" @@ -2969,7 +2969,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.61", + "syn 2.0.65", ] [[package]] @@ -2991,9 +2991,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.61" +version = "2.0.65" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c993ed8ccba56ae856363b1845da7266a7cb78e1d146c8a32d54b45a8b831fc9" +checksum = "d2863d96a84c6439701d7a38f9de935ec562c8832cc55d1dde0f513b52fad106" dependencies = [ "proc-macro2", "quote", @@ -3026,22 +3026,22 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.60" +version = "1.0.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "579e9083ca58dd9dcf91a9923bb9054071b9ebbd800b342194c9feb0ee89fc18" +checksum = "c546c80d6be4bc6a00c0f01730c08df82eaa7a7a61f11d656526506112cc1709" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.60" +version = "1.0.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2470041c06ec3ac1ab38d0356a6119054dedaea53e12fbefc0de730a1c08524" +checksum = "46c3384250002a6d5af4d114f2845d37b57521033f30d5c3f46c4d70e1197533" dependencies = [ "proc-macro2", "quote", - "syn 2.0.61", + "syn 2.0.65", ] [[package]] @@ -3128,7 +3128,7 @@ checksum = "8d9ef545650e79f30233c0003bcc2504d7efac6dad25fca40744de773fe2049c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.61", + "syn 2.0.65", ] [[package]] @@ -3167,7 +3167,7 @@ checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.61", + "syn 2.0.65", ] [[package]] @@ -3305,7 +3305,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.61", + "syn 2.0.65", ] [[package]] @@ -3494,7 +3494,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.61", + "syn 2.0.65", "wasm-bindgen-shared", ] @@ -3516,7 +3516,7 @@ checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.61", + "syn 2.0.65", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -3747,7 +3747,7 @@ checksum = "15e934569e47891f7d9411f1a451d947a60e000ab3bd24fbb970f000387d1b3b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.61", + "syn 2.0.65", ] [[package]] @@ -3767,5 +3767,5 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.61", + "syn 2.0.65", ]