elektra_sys/
lib.rs

1//! Raw bindings for libelektra.
2//! For documentation on the functions, see the [C API documentation](https://doc.libelektra.org/api/latest/html/index.html).
3
4#![allow(non_upper_case_globals)]
5#![allow(non_camel_case_types)]
6#![allow(non_snake_case)]
7
8// Include the created bindings
9include!(concat!(env!("OUT_DIR"), "/bindings.rs"));
10
11pub const KEY_END: *const std::ffi::c_void = std::ptr::null();
12pub const KS_END: *const std::ffi::c_void = std::ptr::null();
13
14#[cfg(test)]
15mod tests {
16    use super::{
17        keyDel, keyName, keyNew, keyString, ksAppendKey, ksDel, ksNew, ksAtCursor, Key,
18        KEY_END, KEY_VALUE,
19    };
20    use std::ffi::{CStr, CString};
21
22    #[test]
23    fn can_write_read_key() {
24        let key_name = CString::new("user:/test/key").unwrap();
25        let key_val = CString::new("rust-bindings").unwrap();
26        let key = unsafe { keyNew(key_name.as_ptr(), KEY_VALUE, key_val.as_ptr(), KEY_END) };
27        let ret_val_str = unsafe { CStr::from_ptr(keyString(key)) };
28        assert_eq!(ret_val_str, key_val.as_c_str());
29        assert_eq!(unsafe { keyDel(key) }, 0);
30    }
31
32    #[test]
33    fn can_iterate_keyset() {
34        let key_name = CString::new("user:/test/key").unwrap();
35        let key_name2 = CString::new("user:/test/key2").unwrap();
36
37        let key = unsafe { keyNew(key_name.as_ptr(), KEY_END) };
38        let key2 = unsafe { keyNew(key_name2.as_ptr(), KEY_END) };
39        let ks = unsafe { ksNew(2) };
40
41        let mut append_res = unsafe { ksAppendKey(ks, key) };
42        assert_eq!(append_res, 1);
43
44        append_res = unsafe { ksAppendKey(ks, key2) };
45        assert_eq!(append_res, 2);
46
47        let mut key_next = unsafe { ksAtCursor(ks, 0) };
48        assert_eq!(key_name.as_c_str(), unsafe {
49            CStr::from_ptr(keyName(key_next))
50        });
51
52        key_next = unsafe { ksAtCursor(ks, 1) };
53        assert_eq!(key_name2.as_c_str(), unsafe {
54            CStr::from_ptr(keyName(key_next))
55        });
56
57        key_next = unsafe { ksAtCursor(ks, 2) };
58        let key_next_ptr: *const Key = key_next;
59        assert!(key_next_ptr.is_null());
60
61        // Deletes ks and both keys
62        assert_eq!(unsafe { ksDel(ks) }, 0);
63    }
64
65}