Skip to main content

rustler/types/
string.rs

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}