diff options
author | Vika <vika@fireburn.ru> | 2024-10-22 21:52:10 +0300 |
---|---|---|
committer | Vika <vika@fireburn.ru> | 2024-10-22 21:52:10 +0300 |
commit | f2f7b6ffec7bf657966353c850d25c6ab218ff7c (patch) | |
tree | d4d5cc76474453863a064eb04d75af5353579f5b /libsecret/src/schema.rs | |
parent | 3bd499a9d696a850a493bf81c01c68aee18c9d7b (diff) | |
download | bowl-f2f7b6ffec7bf657966353c850d25c6ab218ff7c.tar.zst |
vendor libsecret
The libsecret-rs crate is unmaintained, so I'm vendoring it for now. Bumping the glib version turned out to be enough. The exact process I used was: 1. Cloning the repository 2. Making changes 3. `cargo build` to ensure it works 4. `cargo package --no-verify` (b/c it tries to build all crates separately instead of the entire workspace as a whole) 5. `mkdir libsecret/sys -p` 6. `tar --strip-components 1 -C libsecret -xvf ../libsecret-rs/target/package/libsecret-0.6.0.crate` 7. `tar --strip-components 1 -C libsecret/sys -xvf ../libsecret-rs/target/package/libsecret-sys-0.6.0.crate` Then `Cargo.toml` is modified to ensure the libsecret and its `-sys` crate build out of my vendored sources. In the future, if I gain maintainership of the `libsecret` crate, I could just revert this commit to make it point back to the upstream.
Diffstat (limited to 'libsecret/src/schema.rs')
-rw-r--r-- | libsecret/src/schema.rs | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/libsecret/src/schema.rs b/libsecret/src/schema.rs new file mode 100644 index 0000000..b3252e2 --- /dev/null +++ b/libsecret/src/schema.rs @@ -0,0 +1,37 @@ +use crate::{Schema, SchemaAttributeType, SchemaFlags}; +use glib::translate::*; +use std::collections::HashMap; + +impl Schema { + #[doc(alias = "secret_schema_new")] + #[doc(alias = "secret_schema_newv")] + pub fn new( + name: &str, + flags: SchemaFlags, + attribute_names_and_types: HashMap<&str, SchemaAttributeType>, + ) -> Self { + unsafe { + let hash_table = glib::ffi::g_hash_table_new_full( + Some(glib::ffi::g_str_hash), + Some(glib::ffi::g_str_equal), + Some(glib::ffi::g_free), + None, + ); + + for (name, type_) in attribute_names_and_types { + let key_ptr: *mut libc::c_char = name.to_glib_full(); + glib::ffi::g_hash_table_insert( + hash_table, + key_ptr as *mut _, + type_.into_glib() as *mut _, + ); + } + + from_glib_full(ffi::secret_schema_newv( + name.to_glib_none().0, + flags.into_glib(), + hash_table, + )) + } + } +} |