dbase 0.7.0

Read & Write .dbf in Rust
Documentation
use super::{AsCodePageMark, DecodeError, EncodeError, Encoding};

use std::borrow::Cow;

#[derive(Copy, Clone)]
pub struct EncodingRs(&'static encoding_rs::Encoding);

impl From<&'static encoding_rs::Encoding> for EncodingRs {
    fn from(item: &'static encoding_rs::Encoding) -> Self {
        EncodingRs(item)
    }
}

impl AsCodePageMark for EncodingRs {
    fn code_page_mark(&self) -> crate::CodePageMark {
        let code_page = codepage::from_encoding(self.0).unwrap();
        match code_page {
            1252 => crate::CodePageMark::CP1252,
            866 => crate::CodePageMark::CP866,
            874 => crate::CodePageMark::CP874,
            1255 => crate::CodePageMark::CP1255,
            1256 => crate::CodePageMark::CP1256,
            1250 => crate::CodePageMark::CP1250,
            1251 => crate::CodePageMark::CP1251,
            1254 => crate::CodePageMark::CP1254,
            1253 => crate::CodePageMark::CP1253,
            65001 => crate::CodePageMark::Utf8,
            950 => crate::CodePageMark::CP950,
            949 => crate::CodePageMark::CP949,
            936 => crate::CodePageMark::CP936,
            932 => crate::CodePageMark::CP932,
            _ => crate::CodePageMark::Utf8,
        }
    }
}

impl Encoding for EncodingRs {
    fn decode<'a>(&self, bytes: &'a [u8]) -> Result<Cow<'a, str>, DecodeError> {
        Ok(self.0.decode(bytes).0)
    }

    fn encode<'a>(&self, s: &'a str) -> Result<Cow<'a, [u8]>, EncodeError> {
        Ok(self.0.encode(s).0)
    }
}