Skip to main content

tuwunel_database/
handle.rs

1use 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}