tuwunel_database/
handle.rs1use std::{fmt, fmt::Debug, ops::Deref};
2
3use rocksdb::DBPinnableSlice;
4use serde::{Deserialize, Serialize, Serializer};
5use tuwunel_core::Result;
6
7use crate::{Deserialized, Slice, keyval::deserialize_val};
8
9pub struct Handle<'a> {
10 val: DBPinnableSlice<'a>,
11}
12
13impl<'a> From<DBPinnableSlice<'a>> for Handle<'a> {
14 fn from(val: DBPinnableSlice<'a>) -> Self { Self { val } }
15}
16
17impl Debug for Handle<'_> {
18 fn fmt(&self, out: &mut fmt::Formatter<'_>) -> fmt::Result {
19 let val: &Slice = self;
20 let ptr = val.as_ptr();
21 let len = val.len();
22 write!(out, "Handle {{val: {{ptr: {ptr:?}, len: {len}}}}}")
23 }
24}
25
26impl Serialize for Handle<'_> {
27 #[inline]
28 fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
29 let bytes: &Slice = self;
30 serializer.serialize_bytes(bytes)
31 }
32}
33
34impl Deserialized for Result<Handle<'_>> {
35 #[inline]
36 fn map_de<T, U, F>(self, f: F) -> Result<U>
37 where
38 F: FnOnce(T) -> U,
39 T: for<'de> Deserialize<'de>,
40 {
41 self?.map_de(f)
42 }
43}
44
45impl<'a> Deserialized for Result<&'a Handle<'a>> {
46 #[inline]
47 fn map_de<T, U, F>(self, f: F) -> Result<U>
48 where
49 F: FnOnce(T) -> U,
50 T: for<'de> Deserialize<'de>,
51 {
52 self.and_then(|handle| handle.map_de(f))
53 }
54}
55
56impl<'a> Deserialized for &'a Handle<'a> {
57 #[inline]
58 fn map_de<T, U, F>(self, f: F) -> Result<U>
59 where
60 F: FnOnce(T) -> U,
61 T: for<'de> Deserialize<'de>,
62 {
63 deserialize_val(self.as_ref()).map(f)
64 }
65}
66
67impl From<Handle<'_>> for Vec<u8> {
68 fn from(handle: Handle<'_>) -> Self { handle.deref().to_vec() }
69}
70
71impl Deref for Handle<'_> {
72 type Target = Slice;
73
74 #[inline]
75 fn deref(&self) -> &Self::Target { &self.val }
76}
77
78impl AsRef<Slice> for Handle<'_> {
79 #[inline]
80 fn as_ref(&self) -> &Slice { &self.val }
81}