diff options
Diffstat (limited to 'rust/src/metadata.rs')
| -rw-r--r-- | rust/src/metadata.rs | 72 |
1 files changed, 69 insertions, 3 deletions
diff --git a/rust/src/metadata.rs b/rust/src/metadata.rs index 09c21ec9..1ea8225d 100644 --- a/rust/src/metadata.rs +++ b/rust/src/metadata.rs @@ -379,16 +379,32 @@ impl From<f64> for Ref<Metadata> { } } -impl<S: BnStrCompatible> From<S> for Ref<Metadata> { - fn from(value: S) -> Self { +impl From<String> for Ref<Metadata> { + fn from(value: String) -> Self { unsafe { Metadata::ref_from_raw(BNCreateMetadataStringData( - value.into_bytes_with_nul().as_ref().as_ptr() as *const c_char, + value.into_bytes_with_nul().as_ptr() as *const c_char, )) } } } +impl From<&str> for Ref<Metadata> { + fn from(value: &str) -> Self { + unsafe { + Metadata::ref_from_raw(BNCreateMetadataStringData( + value.into_bytes_with_nul().as_ptr() as *const c_char, + )) + } + } +} + +impl<T: Into<Ref<Metadata>>> From<&T> for Ref<Metadata> { + fn from(value: &T) -> Self { + value.into() + } +} + impl From<&Vec<u8>> for Ref<Metadata> { fn from(value: &Vec<u8>) -> Self { unsafe { Metadata::ref_from_raw(BNCreateMetadataRawData(value.as_ptr(), value.len())) } @@ -442,6 +458,56 @@ impl<S: BnStrCompatible> From<HashMap<S, Ref<Metadata>>> for Ref<Metadata> { } } +impl<S: BnStrCompatible + Copy, T: Into<Ref<Metadata>>> From<&[(S, T)]> for Ref<Metadata> { + fn from(value: &[(S, T)]) -> Self { + let mut key_refs: Vec<S::Result> = vec![]; + let mut keys: Vec<*const c_char> = vec![]; + let mut values: Vec<*mut BNMetadata> = vec![]; + for (k, v) in value.iter() { + key_refs.push(k.into_bytes_with_nul()); + let value_metadata: Ref<Metadata> = v.into(); + values.push(value_metadata.handle); + } + for k in &key_refs { + keys.push(k.as_ref().as_ptr() as *const c_char); + } + + unsafe { + Metadata::ref_from_raw(BNCreateMetadataValueStore( + keys.as_mut_ptr(), + values.as_mut_ptr(), + keys.len(), + )) + } + } +} + +impl<S: BnStrCompatible + Copy, T: Into<Ref<Metadata>>, const N: usize> From<[(S, T); N]> + for Ref<Metadata> +{ + fn from(value: [(S, T); N]) -> Self { + let mut key_refs: Vec<S::Result> = vec![]; + let mut keys: Vec<*const c_char> = vec![]; + let mut values: Vec<*mut BNMetadata> = vec![]; + for (k, v) in value.into_iter() { + key_refs.push(k.into_bytes_with_nul()); + let value_metadata: Ref<Metadata> = v.into(); + values.push(value_metadata.handle); + } + for k in &key_refs { + keys.push(k.as_ref().as_ptr() as *const c_char); + } + + unsafe { + Metadata::ref_from_raw(BNCreateMetadataValueStore( + keys.as_mut_ptr(), + values.as_mut_ptr(), + keys.len(), + )) + } + } +} + impl From<&Vec<bool>> for Ref<Metadata> { fn from(value: &Vec<bool>) -> Self { unsafe { |
