1use crate::{
2 fdb_kv, fdb_kv_status, fdb_kv_status_FDB_KV_DELETED, fdb_kv_status_FDB_KV_ERR_HDR, fdb_kv_status_FDB_KV_PRE_DELETE, fdb_kv_status_FDB_KV_PRE_WRITE, fdb_kv_status_FDB_KV_UNUSED, fdb_kv_status_FDB_KV_WRITE, fdb_kv_t, RawHandle
3};
4
5#[repr(u32)]
9#[derive(Debug, PartialEq, Eq, Clone, Copy)]
10pub enum KVStatus {
11 UNUSED = fdb_kv_status_FDB_KV_UNUSED,
13 PRE_WRITE = fdb_kv_status_FDB_KV_PRE_WRITE,
15 Write = fdb_kv_status_FDB_KV_WRITE,
17 PRE_DELETE = fdb_kv_status_FDB_KV_PRE_DELETE,
19 DELETED = fdb_kv_status_FDB_KV_DELETED,
21 ERR_HDR = fdb_kv_status_FDB_KV_ERR_HDR,
23}
24impl From<fdb_kv_status> for KVStatus {
25 fn from(value: fdb_kv_status) -> Self {
30 unsafe { core::mem::transmute(value) }
31 }
32}
33
34#[derive(Debug, Clone, Default)]
35pub struct KVEntry {
36 pub(super) inner: fdb_kv,
37}
38
39impl KVEntry {
40 pub fn status(&self) -> KVStatus {
42 self.inner.status.into()
43 }
44
45 pub fn value_len(&self) -> usize {
47 self.inner.value_len as usize
48 }
49
50 pub fn name(&self) -> Option<&str> {
55 let name_slice = &self.inner.name[..self.inner.name_len as usize];
57 core::str::from_utf8(unsafe {
59 core::slice::from_raw_parts(name_slice.as_ptr() as *const u8, name_slice.len())
61 })
62 .ok()
63 }
64
65 pub fn is_valid(&self) -> bool {
67 self.inner.crc_is_ok
68 }
69}
70
71impl RawHandle for KVEntry {
72 type Handle = fdb_kv_t;
73 fn handle(&self) -> Self::Handle {
74 &self.inner as *const _ as *mut _
75 }
76}
77
78impl From<fdb_kv> for KVEntry {
79 fn from(value: fdb_kv) -> Self {
80 Self { inner: value }
81 }
82}