feat(spanner): implement ToValue for str - #6087
Open
fornwall wants to merge 3 commits into
Open
Conversation
ToValue was implemented for &str but not for the unsized str. Callers had to pass an extra reference (&"hello") or allocate a String. Signed-off-by: Fredrik Fornwall <fredrik@fornwall.net>
Contributor
There was a problem hiding this comment.
Code Review
This pull request refactors the ToValue trait implementation for string types in the Spanner crate by implementing ToValue directly on str and delegating String and &str to it, alongside adding a new unit test. Feedback suggests using fully qualified path syntax (<str as ToValue>::to_value) in both implementations to avoid intermediate delegation steps, improve readability, and prevent potential infinite recursion from auto-ref coercion.
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
This was referenced Jul 27, 2026
olavloite
added a commit
to olavloite/google-cloud-rust
that referenced
this pull request
Jul 27, 2026
Changes `StatementBuilder::add_param`, `StatementBuilder::add_typed_param`, and `ValueBinder::to` to accept `T: Into<Value>` instead of `&T: ToValue`. This allows callers to pass owned values directly (like `String`, `Value`, or `Option<T>`) zero-copy without unnecessary cloning, while maintaining complete backward compatibility for references (`&str`, `&i64`, `&Option<T>`). ### Key Changes - **Direct `From<T> for Value` Implementations**: Added zero-copy `From` conversions for owned types (`String`, `i64`, `i32`, `bool`, `f64`, `f32`, `Decimal`, `Date`, `OffsetDateTime`, `SystemTime`, `wkt::Timestamp`, `Vec<u8>`, `Option<T>`, `Vec<T>`, `ProtoValue`). - **Decoupled `ToValue`**: All `ToValue` trait implementations now delegate directly to `From` / `.into()`, decoupling conversion logic from `ToValue` and paving the way for eventual deprecation of the `ToValue` trait. - **Unsized Slice Support (`[u8]` and `str`)**: Implemented `ToValue` for `[u8]` and `str` (and `&[u8]`, `&str`), enabling zero-copy slice conversions and generic trait bounds `T: ToValue + ?Sized`. This supersedes both PR googleapis#6070 and PR googleapis#6087. - **Untyped NULL Support**: Added `Value::null()`, `From<()>` and `ToValue for ()` to easily support untyped NULL parameters (`Value::null()`, `None::<()>`, `None::<Value>`). - **Cleaned up Examples & Tests**: Updated example scripts and tests to pass owned values directly, eliminating needless reference borrows (`clippy::needless_borrows_for_generic_args`). BREAKING CHANGE: This is a minor breaking change only for code that passes inline `&None` with a method-level turbofish: ```rust // Old (fails to compile): builder.set("Col").to::<Option<bool>>(&None); // Works both before and after this change: builder.set("Col").to(&None::<bool>); // New (remove the &): builder.set("Col").to::<Option<bool>>(None); // Or: builder.set("Col").to(None::<bool>); builder.set("Col").to(Value::null()); ``` Code passing existing `Option` variables (like `.to(&my_var)`) is unaffected and continues to compile unchanged.
olavloite
added a commit
to olavloite/google-cloud-rust
that referenced
this pull request
Jul 27, 2026
Changes `StatementBuilder::add_param`, `StatementBuilder::add_typed_param`, and `ValueBinder::to` to accept `T: Into<Value>` instead of `&T: ToValue`. This allows callers to pass owned values directly (like `String`, `Value`, or `Option<T>`) zero-copy without unnecessary cloning, while maintaining complete backward compatibility for references (`&str`, `&i64`, `&Option<T>`). - **Direct `From<T> for Value` Implementations**: Added zero-copy `From` conversions for owned types (`String`, `i64`, `i32`, `bool`, `f64`, `f32`, `Decimal`, `Date`, `OffsetDateTime`, `SystemTime`, `wkt::Timestamp`, `Vec<u8>`, `Option<T>`, `Vec<T>`, `ProtoValue`). - **Decoupled `ToValue`**: All `ToValue` trait implementations now delegate directly to `From` / `.into()`, decoupling conversion logic from `ToValue` and paving the way for eventual deprecation of the `ToValue` trait. - **Unsized Slice Support (`[u8]` and `str`)**: Implemented `ToValue` for `[u8]` and `str` (and `&[u8]`, `&str`), enabling zero-copy slice conversions and generic trait bounds `T: ToValue + ?Sized`. This supersedes both PR googleapis#6070 and PR googleapis#6087. - **Untyped NULL Support**: Added `Value::null()`, `From<()>` and `ToValue for ()` to easily support untyped NULL parameters (`Value::null()`, `None::<()>`, `None::<Value>`). - **Cleaned up Examples & Tests**: Updated example scripts and tests to pass owned values directly, eliminating needless reference borrows (`clippy::needless_borrows_for_generic_args`). BREAKING CHANGE: This is a minor breaking change only for code that passes inline `&None` with a method-level turbofish: ```rust // Old (fails to compile): builder.set("Col").to::<Option<bool>>(&None); // Works both before and after this change: builder.set("Col").to(&None::<bool>); // New (remove the &): builder.set("Col").to::<Option<bool>>(None); // Or: builder.set("Col").to(None::<bool>); builder.set("Col").to(Value::null()); ``` Code passing existing `Option` variables (like `.to(&my_var)`) is unaffected and continues to compile unchanged.
olavloite
added a commit
to olavloite/google-cloud-rust
that referenced
this pull request
Jul 27, 2026
Changes `StatementBuilder::add_param`, `StatementBuilder::add_typed_param`, and `ValueBinder::to` to accept `T: Into<Value>` instead of `&T: ToValue`. This allows callers to pass owned values directly (like `String`, `Value`, or `Option<T>`) zero-copy without unnecessary cloning, while maintaining complete backward compatibility for references (`&str`, `&i64`, `&Option<T>`). - **Direct `From<T> for Value` Implementations**: Added zero-copy `From` conversions for owned types (`String`, `i64`, `i32`, `bool`, `f64`, `f32`, `Decimal`, `Date`, `OffsetDateTime`, `SystemTime`, `wkt::Timestamp`, `Vec<u8>`, `Option<T>`, `Vec<T>`, `ProtoValue`). - **Decoupled `ToValue`**: All `ToValue` trait implementations now delegate directly to `From` / `.into()`, decoupling conversion logic from `ToValue` and paving the way for eventual deprecation of the `ToValue` trait. - **Unsized Slice Support (`[u8]` and `str`)**: Implemented `ToValue` for `[u8]` and `str` (and `&[u8]`, `&str`), enabling zero-copy slice conversions and generic trait bounds `T: ToValue + ?Sized`. This supersedes both PR googleapis#6070 and PR googleapis#6087. - **Untyped NULL Support**: Added `Value::null()`, `From<()>` and `ToValue for ()` to easily support untyped NULL parameters (`Value::null()`, `None::<()>`, `None::<Value>`). - **Cleaned up Examples & Tests**: Updated example scripts and tests to pass owned values directly, eliminating needless reference borrows (`clippy::needless_borrows_for_generic_args`). BREAKING CHANGE: This is a minor breaking change only for code that passes inline `&None` with a method-level turbofish: ```rust // Old (fails to compile): builder.set("Col").to::<Option<bool>>(&None); // Works both before and after this change: builder.set("Col").to(&None::<bool>); // New (remove the &): builder.set("Col").to::<Option<bool>>(None); // Or: builder.set("Col").to(None::<bool>); builder.set("Col").to(Value::null()); ``` Code passing existing `Option` variables (like `.to(&my_var)`) is unaffected and continues to compile unchanged.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
ToValuewas implemented for&strbut not for the unsizedstr, meaning that callers had to pass an extra reference (&"hello").Fixes #6084.