1use super::binary::{Binary, OwnedBinary};
2use crate::{Decoder, Encoder, Env, Error, NifResult, Term};
3
4impl<'a> Decoder<'a> for String {
5 #[inline]
6 fn decode(term: Term<'a>) -> NifResult<Self> {
7 let string: &str = Decoder::decode(term)?;
8 Ok(string.to_string())
9 }
10}
11impl<'a> Decoder<'a> for &'a str {
12 #[inline]
13 fn decode(term: Term<'a>) -> NifResult<Self> {
14 let binary = Binary::from_term(term)?;
15 match ::std::str::from_utf8(binary.as_slice()) {
16 Ok(string) => Ok(string),
17 Err(_) => Err(Error::BadArg),
18 }
19 }
20}
21
22use std::io::Write;
23
24impl Encoder for &str {
25 fn encode<'b>(&self, env: Env<'b>) -> Term<'b> {
26 (*self).encode(env)
27 }
28}
29
30impl Encoder for str {
31 fn encode<'b>(&self, env: Env<'b>) -> Term<'b> {
32 let str_len = self.len();
33 let mut bin = match OwnedBinary::new(str_len) {
34 Some(bin) => bin,
35 None => panic!("binary term allocation fail"),
36 };
37 bin.as_mut_slice()
38 .write_all(self.as_bytes())
39 .expect("memory copy of string failed");
40 bin.release(env).to_term(env)
41 }
42}
43
44impl Encoder for String {
45 fn encode<'b>(&self, env: Env<'b>) -> Term<'b> {
46 self.as_str().encode(env)
47 }
48}