calimero_sys/types/
buffer.rs1use core::marker::PhantomData;
2use core::ops::{Deref, DerefMut};
3use core::str::{from_utf8, Utf8Error};
4
5use super::Pointer;
6
7#[cfg(target_arch = "wasm32")]
8mod guest;
9
10#[cfg(not(target_arch = "wasm32"))]
11mod host;
12
13#[repr(C)]
14#[derive(Clone, Copy, Debug, Eq, PartialEq)]
15pub struct Slice<'a, T> {
16 ptr: Pointer<T>,
17 len: u64,
18 _phantom: PhantomData<&'a T>,
19}
20
21pub type Buffer<'a> = Slice<'a, u8>;
22pub type BufferMut<'a> = Buffer<'a>;
23
24impl<'a, T> AsRef<[T]> for Slice<'a, T> {
25 #[inline]
26 fn as_ref(&self) -> &'a [T] {
27 self.as_slice()
28 }
29}
30
31impl<'a, T> AsMut<[T]> for Slice<'a, T> {
32 #[inline]
33 fn as_mut(&mut self) -> &'a mut [T] {
34 self.as_mut_slice()
35 }
36}
37
38impl<'a, T> From<&'a [T]> for Slice<'a, T> {
39 #[inline]
40 fn from(buf: &'a [T]) -> Self {
41 Self::new(buf)
42 }
43}
44
45impl<'a, T> From<&'a mut [T]> for Slice<'a, T> {
46 #[inline]
47 fn from(buf: &'a mut [T]) -> Self {
48 Self::new(buf)
49 }
50}
51
52impl<'a, T> Deref for Slice<'a, T> {
53 type Target = [T];
54
55 #[inline]
56 fn deref(&self) -> &'a Self::Target {
57 self.as_slice()
58 }
59}
60
61impl<'a, T> DerefMut for Slice<'a, T> {
62 #[inline]
63 fn deref_mut(&mut self) -> &'a mut Self::Target {
64 self.as_mut_slice()
65 }
66}
67
68impl<'a> TryFrom<Buffer<'a>> for &'a str {
69 type Error = Utf8Error;
70
71 fn try_from(buf: Buffer<'a>) -> Result<Self, Self::Error> {
72 from_utf8(buf.as_slice())
73 }
74}