Conversation
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #10 +/- ##
=========================================
Coverage 100.00% 100.00%
=========================================
Files 6 6
Lines 898 957 +59
=========================================
+ Hits 898 957 +59 ☔ View full report in Codecov by Sentry. |
There was a problem hiding this comment.
Pull Request Overview
This PR adds type name metadata to MassMap files and introduces an unsafe cast method for type conversion. The changes store the original key and value type names in the metadata when building or merging MassMaps, and provide a mechanism to reinterpret a MassMap with different type parameters.
- Adds
key_typeandvalue_typestring fields toMassMapMetato store type information - Populates these fields using
std::any::type_nameduring map building and merging - Introduces a public
castmethod to convert between different type parameter combinations
Reviewed Changes
Copilot reviewed 3 out of 3 changed files in this pull request and generated 3 comments.
| File | Description |
|---|---|
| src/meta.rs | Adds key_type and value_type fields to MassMapMeta struct |
| src/builder.rs | Populates type name fields in both build and merge methods using std::any::type_name |
| src/massmap.rs | Adds cast method for type conversion and includes a test case demonstrating the functionality |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
There was a problem hiding this comment.
Pull Request Overview
Copilot reviewed 7 out of 7 changed files in this pull request and generated 7 comments.
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| { | ||
| /// Constructs a massmap from a [`MassMapReader`] implementation. | ||
| /// | ||
| /// The method validates the leading header (magic number, metadata offset and |
There was a problem hiding this comment.
The doc comment for MassMap::load is incomplete. The third line is truncated mid-sentence. Compare with the complete documentation on MassMapInner::load (lines 49-53) which describes what happens with errors. The documentation should be completed or the incomplete lines removed.
| /// The method validates the leading header (magic number, metadata offset and | |
| /// The method validates the leading header (magic number, metadata offset and | |
| /// length) and deserializes [`MassMapMeta`]. Any IO or deserialization errors | |
| /// are forwarded to the caller. |
| } | ||
| } | ||
|
|
||
| pub fn cast<K, V>(self) -> MassMap<K, V, R, H> |
There was a problem hiding this comment.
The cast method performs an unsafe type conversion without validating that the actual stored types match K and V. Consider validating self.meta.key_type against std::any::type_name::<K>() and self.meta.value_type against std::any::type_name::<V>() and returning a Result to prevent silent type mismatches that would cause deserialization errors later.
| args.key.map(|x| x.parse().unwrap()), | ||
| args.bucket, | ||
| )?, | ||
| "u16" => do_query( | ||
| map.cast::<u16, _>(), | ||
| args.key.map(|x| x.parse().unwrap()), | ||
| args.bucket, | ||
| )?, | ||
| "u32" => do_query( | ||
| map.cast::<u32, _>(), | ||
| args.key.map(|x| x.parse().unwrap()), | ||
| args.bucket, | ||
| )?, | ||
| "u64" => do_query( | ||
| map.cast::<u64, _>(), | ||
| args.key.map(|x| x.parse().unwrap()), | ||
| args.bucket, | ||
| )?, | ||
| "u128" => do_query( | ||
| map.cast::<u128, _>(), | ||
| args.key.map(|x| x.parse().unwrap()), |
There was a problem hiding this comment.
Calling unwrap() on parse() will panic if the key string cannot be parsed as a u8. This could happen with valid user input (e.g., "256" or "abc"). Use proper error handling such as parse().map_err(|e| Error::new(ErrorKind::InvalidInput, format!(\"Invalid key: {}\", e)))? instead.
| args.key.map(|x| x.parse().unwrap()), | |
| args.bucket, | |
| )?, | |
| "u16" => do_query( | |
| map.cast::<u16, _>(), | |
| args.key.map(|x| x.parse().unwrap()), | |
| args.bucket, | |
| )?, | |
| "u32" => do_query( | |
| map.cast::<u32, _>(), | |
| args.key.map(|x| x.parse().unwrap()), | |
| args.bucket, | |
| )?, | |
| "u64" => do_query( | |
| map.cast::<u64, _>(), | |
| args.key.map(|x| x.parse().unwrap()), | |
| args.bucket, | |
| )?, | |
| "u128" => do_query( | |
| map.cast::<u128, _>(), | |
| args.key.map(|x| x.parse().unwrap()), | |
| args.key | |
| .map(|x| x.parse().map_err(|e| Error::new(ErrorKind::InvalidInput, format!("Invalid key: {}", e)))) | |
| .transpose()?, | |
| args.bucket, | |
| )?, | |
| "u16" => do_query( | |
| map.cast::<u16, _>(), | |
| args.key | |
| .map(|x| x.parse().map_err(|e| Error::new(ErrorKind::InvalidInput, format!("Invalid key: {}", e)))) | |
| .transpose()?, | |
| args.bucket, | |
| )?, | |
| "u32" => do_query( | |
| map.cast::<u32, _>(), | |
| args.key | |
| .map(|x| x.parse().map_err(|e| Error::new(ErrorKind::InvalidInput, format!("Invalid key: {}", e)))) | |
| .transpose()?, | |
| args.bucket, | |
| )?, | |
| "u64" => do_query( | |
| map.cast::<u64, _>(), | |
| args.key | |
| .map(|x| x.parse().map_err(|e| Error::new(ErrorKind::InvalidInput, format!("Invalid key: {}", e)))) | |
| .transpose()?, | |
| args.bucket, | |
| )?, | |
| "u128" => do_query( | |
| map.cast::<u128, _>(), | |
| args.key | |
| .map(|x| x.parse().map_err(|e| Error::new(ErrorKind::InvalidInput, format!("Invalid key: {}", e)))) | |
| .transpose()?, |
| args.key.map(|x| x.parse().unwrap()), | ||
| args.bucket, | ||
| )?, | ||
| "u16" => do_query( | ||
| map.cast::<u16, _>(), | ||
| args.key.map(|x| x.parse().unwrap()), | ||
| args.bucket, | ||
| )?, | ||
| "u32" => do_query( | ||
| map.cast::<u32, _>(), | ||
| args.key.map(|x| x.parse().unwrap()), | ||
| args.bucket, | ||
| )?, | ||
| "u64" => do_query( | ||
| map.cast::<u64, _>(), | ||
| args.key.map(|x| x.parse().unwrap()), | ||
| args.bucket, | ||
| )?, | ||
| "u128" => do_query( | ||
| map.cast::<u128, _>(), | ||
| args.key.map(|x| x.parse().unwrap()), |
There was a problem hiding this comment.
Calling unwrap() on parse() will panic if the key string cannot be parsed as a u16. Use proper error handling such as parse().map_err(|e| Error::new(ErrorKind::InvalidInput, format!(\"Invalid key: {}\", e)))? instead.
| args.key.map(|x| x.parse().unwrap()), | |
| args.bucket, | |
| )?, | |
| "u16" => do_query( | |
| map.cast::<u16, _>(), | |
| args.key.map(|x| x.parse().unwrap()), | |
| args.bucket, | |
| )?, | |
| "u32" => do_query( | |
| map.cast::<u32, _>(), | |
| args.key.map(|x| x.parse().unwrap()), | |
| args.bucket, | |
| )?, | |
| "u64" => do_query( | |
| map.cast::<u64, _>(), | |
| args.key.map(|x| x.parse().unwrap()), | |
| args.bucket, | |
| )?, | |
| "u128" => do_query( | |
| map.cast::<u128, _>(), | |
| args.key.map(|x| x.parse().unwrap()), | |
| args.key | |
| .map(|x| x.parse().map_err(|e| Error::new(ErrorKind::InvalidInput, format!("Invalid key: {}", e)))?) | |
| args.bucket, | |
| )?, | |
| "u16" => do_query( | |
| map.cast::<u16, _>(), | |
| args.key | |
| .map(|x| x.parse().map_err(|e| Error::new(ErrorKind::InvalidInput, format!("Invalid key: {}", e)))?) | |
| args.bucket, | |
| )?, | |
| "u32" => do_query( | |
| map.cast::<u32, _>(), | |
| args.key | |
| .map(|x| x.parse().map_err(|e| Error::new(ErrorKind::InvalidInput, format!("Invalid key: {}", e)))?) | |
| args.bucket, | |
| )?, | |
| "u64" => do_query( | |
| map.cast::<u64, _>(), | |
| args.key | |
| .map(|x| x.parse().map_err(|e| Error::new(ErrorKind::InvalidInput, format!("Invalid key: {}", e)))?) | |
| args.bucket, | |
| )?, | |
| "u128" => do_query( | |
| map.cast::<u128, _>(), | |
| args.key | |
| .map(|x| x.parse().map_err(|e| Error::new(ErrorKind::InvalidInput, format!("Invalid key: {}", e)))?) |
| args.key.map(|x| x.parse().unwrap()), | ||
| args.bucket, | ||
| )?, | ||
| "u16" => do_query( | ||
| map.cast::<u16, _>(), | ||
| args.key.map(|x| x.parse().unwrap()), | ||
| args.bucket, | ||
| )?, | ||
| "u32" => do_query( | ||
| map.cast::<u32, _>(), | ||
| args.key.map(|x| x.parse().unwrap()), | ||
| args.bucket, | ||
| )?, | ||
| "u64" => do_query( | ||
| map.cast::<u64, _>(), | ||
| args.key.map(|x| x.parse().unwrap()), | ||
| args.bucket, | ||
| )?, | ||
| "u128" => do_query( | ||
| map.cast::<u128, _>(), | ||
| args.key.map(|x| x.parse().unwrap()), |
There was a problem hiding this comment.
Calling unwrap() on parse() will panic if the key string cannot be parsed as a u32. Use proper error handling such as parse().map_err(|e| Error::new(ErrorKind::InvalidInput, format!(\"Invalid key: {}\", e)))? instead.
| args.key.map(|x| x.parse().unwrap()), | |
| args.bucket, | |
| )?, | |
| "u16" => do_query( | |
| map.cast::<u16, _>(), | |
| args.key.map(|x| x.parse().unwrap()), | |
| args.bucket, | |
| )?, | |
| "u32" => do_query( | |
| map.cast::<u32, _>(), | |
| args.key.map(|x| x.parse().unwrap()), | |
| args.bucket, | |
| )?, | |
| "u64" => do_query( | |
| map.cast::<u64, _>(), | |
| args.key.map(|x| x.parse().unwrap()), | |
| args.bucket, | |
| )?, | |
| "u128" => do_query( | |
| map.cast::<u128, _>(), | |
| args.key.map(|x| x.parse().unwrap()), | |
| args.key | |
| .map(|x| x.parse().map_err(|e| Error::new(ErrorKind::InvalidInput, format!("Invalid key: {}", e)))) | |
| .transpose()?, | |
| args.bucket, | |
| )?, | |
| "u16" => do_query( | |
| map.cast::<u16, _>(), | |
| args.key | |
| .map(|x| x.parse().map_err(|e| Error::new(ErrorKind::InvalidInput, format!("Invalid key: {}", e)))) | |
| .transpose()?, | |
| args.bucket, | |
| )?, | |
| "u32" => do_query( | |
| map.cast::<u32, _>(), | |
| args.key | |
| .map(|x| x.parse().map_err(|e| Error::new(ErrorKind::InvalidInput, format!("Invalid key: {}", e)))) | |
| .transpose()?, | |
| args.bucket, | |
| )?, | |
| "u64" => do_query( | |
| map.cast::<u64, _>(), | |
| args.key | |
| .map(|x| x.parse().map_err(|e| Error::new(ErrorKind::InvalidInput, format!("Invalid key: {}", e)))) | |
| .transpose()?, | |
| args.bucket, | |
| )?, | |
| "u128" => do_query( | |
| map.cast::<u128, _>(), | |
| args.key | |
| .map(|x| x.parse().map_err(|e| Error::new(ErrorKind::InvalidInput, format!("Invalid key: {}", e)))) | |
| .transpose()?, |
| args.key.map(|x| x.parse().unwrap()), | ||
| args.bucket, | ||
| )?, | ||
| "u16" => do_query( | ||
| map.cast::<u16, _>(), | ||
| args.key.map(|x| x.parse().unwrap()), | ||
| args.bucket, | ||
| )?, | ||
| "u32" => do_query( | ||
| map.cast::<u32, _>(), | ||
| args.key.map(|x| x.parse().unwrap()), | ||
| args.bucket, | ||
| )?, | ||
| "u64" => do_query( | ||
| map.cast::<u64, _>(), | ||
| args.key.map(|x| x.parse().unwrap()), | ||
| args.bucket, | ||
| )?, | ||
| "u128" => do_query( | ||
| map.cast::<u128, _>(), | ||
| args.key.map(|x| x.parse().unwrap()), |
There was a problem hiding this comment.
Calling unwrap() on parse() will panic if the key string cannot be parsed as a u64. Use proper error handling such as parse().map_err(|e| Error::new(ErrorKind::InvalidInput, format!(\"Invalid key: {}\", e)))? instead.
| args.key.map(|x| x.parse().unwrap()), | |
| args.bucket, | |
| )?, | |
| "u16" => do_query( | |
| map.cast::<u16, _>(), | |
| args.key.map(|x| x.parse().unwrap()), | |
| args.bucket, | |
| )?, | |
| "u32" => do_query( | |
| map.cast::<u32, _>(), | |
| args.key.map(|x| x.parse().unwrap()), | |
| args.bucket, | |
| )?, | |
| "u64" => do_query( | |
| map.cast::<u64, _>(), | |
| args.key.map(|x| x.parse().unwrap()), | |
| args.bucket, | |
| )?, | |
| "u128" => do_query( | |
| map.cast::<u128, _>(), | |
| args.key.map(|x| x.parse().unwrap()), | |
| args.key | |
| .map(|x| x.parse().map_err(|e| Error::new(ErrorKind::InvalidInput, format!("Invalid key '{}': {}", x, e)))) | |
| .transpose()?, | |
| args.bucket, | |
| )?, | |
| "u16" => do_query( | |
| map.cast::<u16, _>(), | |
| args.key | |
| .map(|x| x.parse().map_err(|e| Error::new(ErrorKind::InvalidInput, format!("Invalid key '{}': {}", x, e)))) | |
| .transpose()?, | |
| args.bucket, | |
| )?, | |
| "u32" => do_query( | |
| map.cast::<u32, _>(), | |
| args.key | |
| .map(|x| x.parse().map_err(|e| Error::new(ErrorKind::InvalidInput, format!("Invalid key '{}': {}", x, e)))) | |
| .transpose()?, | |
| args.bucket, | |
| )?, | |
| "u64" => do_query( | |
| map.cast::<u64, _>(), | |
| args.key | |
| .map(|x| x.parse().map_err(|e| Error::new(ErrorKind::InvalidInput, format!("Invalid key '{}': {}", x, e)))) | |
| .transpose()?, | |
| args.bucket, | |
| )?, | |
| "u128" => do_query( | |
| map.cast::<u128, _>(), | |
| args.key | |
| .map(|x| x.parse().map_err(|e| Error::new(ErrorKind::InvalidInput, format!("Invalid key '{}': {}", x, e)))) | |
| .transpose()?, |
| args.key.map(|x| x.parse().unwrap()), | ||
| args.bucket, | ||
| )?, | ||
| "u16" => do_query( | ||
| map.cast::<u16, _>(), | ||
| args.key.map(|x| x.parse().unwrap()), | ||
| args.bucket, | ||
| )?, | ||
| "u32" => do_query( | ||
| map.cast::<u32, _>(), | ||
| args.key.map(|x| x.parse().unwrap()), | ||
| args.bucket, | ||
| )?, | ||
| "u64" => do_query( | ||
| map.cast::<u64, _>(), | ||
| args.key.map(|x| x.parse().unwrap()), | ||
| args.bucket, | ||
| )?, | ||
| "u128" => do_query( | ||
| map.cast::<u128, _>(), | ||
| args.key.map(|x| x.parse().unwrap()), | ||
| args.bucket, | ||
| )?, |
There was a problem hiding this comment.
Calling unwrap() on parse() will panic if the key string cannot be parsed as a u128. Use proper error handling such as parse().map_err(|e| Error::new(ErrorKind::InvalidInput, format!(\"Invalid key: {}\", e)))? instead.
| args.key.map(|x| x.parse().unwrap()), | |
| args.bucket, | |
| )?, | |
| "u16" => do_query( | |
| map.cast::<u16, _>(), | |
| args.key.map(|x| x.parse().unwrap()), | |
| args.bucket, | |
| )?, | |
| "u32" => do_query( | |
| map.cast::<u32, _>(), | |
| args.key.map(|x| x.parse().unwrap()), | |
| args.bucket, | |
| )?, | |
| "u64" => do_query( | |
| map.cast::<u64, _>(), | |
| args.key.map(|x| x.parse().unwrap()), | |
| args.bucket, | |
| )?, | |
| "u128" => do_query( | |
| map.cast::<u128, _>(), | |
| args.key.map(|x| x.parse().unwrap()), | |
| args.bucket, | |
| )?, | |
| args.key | |
| .map(|x| x.parse().map_err(|e| Error::new(ErrorKind::InvalidInput, format!("Invalid key: {}", e)))) | |
| .transpose()?, | |
| "u16" => do_query( | |
| map.cast::<u16, _>(), | |
| args.key | |
| .map(|x| x.parse().map_err(|e| Error::new(ErrorKind::InvalidInput, format!("Invalid key: {}", e)))) | |
| .transpose()?, | |
| "u32" => do_query( | |
| map.cast::<u32, _>(), | |
| args.key | |
| .map(|x| x.parse().map_err(|e| Error::new(ErrorKind::InvalidInput, format!("Invalid key: {}", e)))) | |
| .transpose()?, | |
| "u64" => do_query( | |
| map.cast::<u64, _>(), | |
| args.key | |
| .map(|x| x.parse().map_err(|e| Error::new(ErrorKind::InvalidInput, format!("Invalid key: {}", e)))) | |
| .transpose()?, | |
| "u128" => do_query( | |
| map.cast::<u128, _>(), | |
| args.key | |
| .map(|x| x.parse().map_err(|e| Error::new(ErrorKind::InvalidInput, format!("Invalid key: {}", e)))) | |
| .transpose()?, |
No description provided.