use crate::codec::{CodecError, Decoder, Encoder};
use crate::types::{AnyTerm, Binary, Env, List};
impl<'id> Encoder<'id> for str {
fn encode(&self, env: impl Env<'id>) -> Result<AnyTerm<'id>, CodecError> {
Binary::from_bytes(env, self.as_bytes()).encode(env)
}
}
impl<'id> Encoder<'id> for String {
fn encode(&self, env: impl Env<'id>) -> Result<AnyTerm<'id>, CodecError> {
self.as_str().encode(env)
}
}
impl<'id> Decoder<'id> for String {
fn decode(term: AnyTerm<'id>, env: impl Env<'id>) -> Result<Self, CodecError> {
if let Ok(bin) = Binary::decode(term, env) {
return bin.try_str(env).map(str::to_owned).map_err(|_| CodecError::NotUtf8);
}
if let Ok(list) = List::decode(term, env) {
return list.try_string(env).ok_or(CodecError::NotUtf8);
}
Err(CodecError::WrongType)
}
}