extism_convert/
from_bytes.rs1use crate::*;
2
3pub use extism_convert_macros::FromBytes;
4
5pub trait FromBytes<'a>: Sized {
58 fn from_bytes(data: &'a [u8]) -> Result<Self, Error>;
60}
61
62pub trait FromBytesOwned: Sized {
67 fn from_bytes_owned(data: &[u8]) -> Result<Self, Error>;
70}
71
72impl<'a> FromBytes<'a> for &'a [u8] {
73 fn from_bytes(data: &'a [u8]) -> Result<Self, Error> {
74 Ok(data)
75 }
76}
77
78impl<'a> FromBytes<'a> for &'a str {
79 fn from_bytes(data: &'a [u8]) -> Result<Self, Error> {
80 Ok(std::str::from_utf8(data)?)
81 }
82}
83
84impl<'a, T: FromBytesOwned> FromBytes<'a> for T {
85 fn from_bytes(data: &'a [u8]) -> Result<Self, Error> {
86 T::from_bytes_owned(data)
87 }
88}
89
90impl FromBytesOwned for Box<[u8]> {
91 fn from_bytes_owned(data: &[u8]) -> Result<Self, Error> {
92 Ok(data.to_vec().into_boxed_slice())
93 }
94}
95
96impl FromBytesOwned for Vec<u8> {
97 fn from_bytes_owned(data: &[u8]) -> Result<Self, Error> {
98 Ok(data.to_vec())
99 }
100}
101
102impl FromBytesOwned for String {
103 fn from_bytes_owned(data: &[u8]) -> Result<Self, Error> {
104 Ok(std::str::from_utf8(data)?.to_string())
105 }
106}
107
108impl FromBytesOwned for f64 {
109 fn from_bytes_owned(data: &[u8]) -> Result<Self, Error> {
110 Ok(Self::from_le_bytes(data.try_into()?))
111 }
112}
113
114impl FromBytesOwned for f32 {
115 fn from_bytes_owned(data: &[u8]) -> Result<Self, Error> {
116 Ok(Self::from_le_bytes(data.try_into()?))
117 }
118}
119
120impl FromBytesOwned for i64 {
121 fn from_bytes_owned(data: &[u8]) -> Result<Self, Error> {
122 Ok(Self::from_le_bytes(data.try_into()?))
123 }
124}
125
126impl FromBytesOwned for i32 {
127 fn from_bytes_owned(data: &[u8]) -> Result<Self, Error> {
128 Ok(Self::from_le_bytes(data.try_into()?))
129 }
130}
131
132impl FromBytesOwned for u64 {
133 fn from_bytes_owned(data: &[u8]) -> Result<Self, Error> {
134 Ok(Self::from_le_bytes(data.try_into()?))
135 }
136}
137
138impl FromBytesOwned for u32 {
139 fn from_bytes_owned(data: &[u8]) -> Result<Self, Error> {
140 Ok(Self::from_le_bytes(data.try_into()?))
141 }
142}
143
144impl FromBytesOwned for bool {
145 fn from_bytes_owned(data: &[u8]) -> Result<Self, Error> {
146 if let Some(x) = data.first() {
147 Ok(*x != 0)
148 } else {
149 Err(Error::msg("Expected one byte to read boolean value"))
150 }
151 }
152}
153
154impl FromBytesOwned for () {
155 fn from_bytes_owned(_: &[u8]) -> Result<Self, Error> {
156 Ok(())
157 }
158}
159
160impl<'a, T: FromBytes<'a>> FromBytes<'a> for std::io::Cursor<T> {
161 fn from_bytes(data: &'a [u8]) -> Result<Self, Error> {
162 Ok(std::io::Cursor::new(T::from_bytes(data)?))
163 }
164}
165
166impl<'a, T: FromBytes<'a>> FromBytes<'a> for Option<T> {
167 fn from_bytes(data: &'a [u8]) -> Result<Self, Error> {
168 if data.is_empty() {
169 return Ok(None);
170 }
171
172 T::from_bytes(data).map(Some)
173 }
174}