1#[cfg(feature = "serde")]
2use alloc::string::String;
3use alloc::{boxed::Box, vec::Vec};
4use core::convert::Infallible;
5
6use bstr::{BStr, BString, ByteSlice};
7
8#[cfg(feature = "serde")]
9use crate::buffer::Deserializable;
10use crate::{
11 buffer::{
12 Buffer, BufferMut, Concatenable, Emptyable, Extendable, Slice, Subsliceable, Zeroable,
13 },
14 error::TryReserveError,
15};
16
17unsafe impl Slice for BStr {
18 type Item = u8;
19 type Vec = BString;
20
21 fn to_slice(&self) -> &[Self::Item] {
22 self
23 }
24 unsafe fn to_slice_mut(&mut self) -> &mut [Self::Item] {
25 self
26 }
27 fn into_boxed_slice(self: Box<Self>) -> Box<[Self::Item]> {
28 self.into()
29 }
30 fn into_vec(vec: Self::Vec) -> Vec<Self::Item> {
31 vec.into()
32 }
33
34 unsafe fn from_slice_unchecked(slice: &[Self::Item]) -> &Self {
35 slice.as_bstr()
36 }
37 unsafe fn from_slice_mut_unchecked(slice: &mut [Self::Item]) -> &mut Self {
38 slice.as_bstr_mut()
39 }
40 unsafe fn from_boxed_slice_unchecked(boxed: Box<[Self::Item]>) -> Box<Self> {
41 boxed.into()
42 }
43 unsafe fn from_vec_unchecked(vec: Vec<Self::Item>) -> Self::Vec {
44 vec.into()
45 }
46
47 type TryFromSliceError = Infallible;
48 fn try_from_slice(slice: &[Self::Item]) -> Result<&Self, Self::TryFromSliceError> {
49 Ok(slice.as_bstr())
50 }
51 fn try_from_slice_mut(slice: &mut [Self::Item]) -> Result<&mut Self, Self::TryFromSliceError> {
52 Ok(slice.as_bstr_mut())
53 }
54}
55
56unsafe impl Emptyable for BStr {}
57
58unsafe impl Zeroable for BStr {}
59
60unsafe impl Subsliceable for BStr {
61 unsafe fn check_subslice(&self, _start: usize, _end: usize) {}
62}
63
64unsafe impl Concatenable for BStr {}
65
66unsafe impl Extendable for BStr {}
67
68#[cfg(feature = "serde")]
69impl Deserializable for BStr {
70 fn deserialize<'de, D: serde::Deserializer<'de>, V: serde::de::Visitor<'de>>(
71 deserializer: D,
72 visitor: V,
73 ) -> Result<V::Value, D::Error> {
74 deserializer.deserialize_byte_buf(visitor)
75 }
76 fn expecting(f: &mut core::fmt::Formatter) -> core::fmt::Result {
77 write!(f, "a byte string")
78 }
79 fn deserialize_from_bytes<E: serde::de::Error>(bytes: &[u8]) -> Result<&Self, E> {
80 Ok(bytes.into())
81 }
82 fn deserialize_from_byte_buf<E: serde::de::Error>(bytes: Vec<u8>) -> Result<Self::Vec, E> {
83 Ok(bytes.into())
84 }
85 fn deserialize_from_str<E: serde::de::Error>(s: &str) -> Result<&Self, E> {
86 Ok(s.into())
87 }
88 fn deserialize_from_string<E: serde::de::Error>(s: String) -> Result<Self::Vec, E> {
89 Ok(s.into())
90 }
91 fn try_deserialize_from_seq() -> bool {
92 false
93 }
94}
95
96impl Buffer<BStr> for BString {
97 fn as_slice(&self) -> &BStr {
98 self.as_bstr()
99 }
100}
101
102unsafe impl BufferMut<BStr> for BString {
103 fn as_mut_slice(&mut self) -> &mut BStr {
104 self.as_bstr_mut()
105 }
106
107 fn capacity(&self) -> usize {
108 (**self).capacity()
109 }
110
111 unsafe fn set_len(&mut self, len: usize) -> bool {
112 unsafe { (**self).set_len(len) };
113 true
114 }
115
116 fn try_reserve(&mut self, additional: usize) -> Result<(), TryReserveError> {
117 BufferMut::try_reserve(&mut **self, additional)
118 }
119}