1use std::ops::{Deref, DerefMut};
2
3use memmap2::MmapMut;
4use parking_lot::{ArcRwLockWriteGuard, RawRwLock};
5
6use crate::{DerefError, MemoryMap, WritableMemoryMap};
7
8#[derive(Debug)]
9pub enum WriteGuard {
10 Writable(ArcRwLockWriteGuard<RawRwLock, MmapMut>, WritableMemoryMap),
11}
12
13impl TryFrom<&MemoryMap> for WriteGuard {
14 type Error = DerefError;
15
16 fn try_from(value: &MemoryMap) -> Result<Self, Self::Error> {
17 match value {
18 MemoryMap::Readable(_) => Err(DerefError::ReadOnly),
19 MemoryMap::Writable(value) => Ok(value.clone().into()),
20 }
21 }
22}
23
24impl TryFrom<MemoryMap> for WriteGuard {
25 type Error = DerefError;
26
27 fn try_from(value: MemoryMap) -> Result<Self, Self::Error> {
28 match value {
29 MemoryMap::Readable(_) => Err(DerefError::ReadOnly),
30 MemoryMap::Writable(value) => Ok(value.into()),
31 }
32 }
33}
34
35impl From<WritableMemoryMap> for WriteGuard {
36 fn from(value: WritableMemoryMap) -> Self {
37 Self::Writable(value.write(), value)
38 }
39}
40
41impl From<&WriteGuard> for WritableMemoryMap {
42 fn from(value: &WriteGuard) -> Self {
43 match value {
44 WriteGuard::Writable(_, value) => value.clone(),
45 }
46 }
47}
48
49impl From<WriteGuard> for WritableMemoryMap {
50 fn from(value: WriteGuard) -> Self {
51 match value {
52 WriteGuard::Writable(_, value) => value,
53 }
54 }
55}
56
57impl From<&WriteGuard> for MemoryMap {
58 fn from(value: &WriteGuard) -> Self {
59 Self::Writable(value.into())
60 }
61}
62
63impl From<WriteGuard> for MemoryMap {
64 fn from(value: WriteGuard) -> Self {
65 Self::Writable(value.into())
66 }
67}
68
69impl AsRef<[u8]> for WriteGuard {
70 fn as_ref(&self) -> &[u8] {
71 match self {
72 Self::Writable(value, _) => value,
73 }
74 }
75}
76
77impl Deref for WriteGuard {
78 type Target = [u8];
79
80 fn deref(&self) -> &Self::Target {
81 self.as_ref()
82 }
83}
84
85impl DerefMut for WriteGuard {
86 fn deref_mut(&mut self) -> &mut Self::Target {
87 match self {
88 Self::Writable(value, _) => value,
89 }
90 }
91}