use std::io::Write;
mod data;
mod iso8859;
mod utils;
mod gb2312;
mod geo;
mod iso6937;
mod utf16;
mod utf8;
pub mod dvb;
pub use gb2312::Gb2312;
pub use geo::Geo;
pub use iso6937::Iso6937;
pub use iso8859::*;
pub use utf8::Utf8;
pub use utf16::Utf16;
pub(crate) use utils::*;
pub trait Textcode {
fn decode<W: Write, R: AsRef<[u8]>>(src: R, dst: &mut W) -> std::io::Result<usize>;
fn encode<W: Write, R: AsRef<str>>(src: R, dst: &mut W) -> std::io::Result<usize>;
}
pub fn decode<T: Textcode>(src: impl AsRef<[u8]>) -> String {
let mut result = String::new();
let dst = unsafe { result.as_mut_vec() };
let _ = T::decode(src, dst);
result
}
pub fn decode_to_slice<T: Textcode>(src: impl AsRef<[u8]>, dst: &mut [u8]) -> usize {
let mut cursor = std::io::Cursor::new(dst);
T::decode(src, &mut cursor).unwrap_or(0)
}
pub fn encode<T: Textcode>(src: impl AsRef<str>) -> Vec<u8> {
let mut ret = Vec::new();
let _ = T::encode(src, &mut ret);
ret
}
pub fn encode_to_slice<T: Textcode>(src: impl AsRef<str>, dst: &mut [u8]) -> usize {
let mut cursor = std::io::Cursor::new(dst);
T::encode(src, &mut cursor).unwrap_or(0)
}