ps_mmap/guards/
write.rs

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}