1#![deny(missing_docs)]
2#![deny(missing_debug_implementations)]
3#![cfg_attr(
4 any(windows, all(target_arch = "wasm32", feature = "web-encoding"),),
5 no_std
6)]
7#![doc = include_str!("../docs/README.md")]
8
9extern crate alloc;
10
11mod bom;
12mod encoding;
13mod error;
14mod sys;
15mod utf;
16
17use core::str::FromStr;
18
19use alloc::{string::String, vec::Vec};
20
21pub use error::{ConvertError, ConvertLossyError};
22
23#[doc = include_str!("../docs/convert.md")]
24pub fn convert(
25 input: impl AsRef<[u8]>,
26 from_encoding: &str,
27 to_encoding: &str,
28) -> Result<Vec<u8>, ConvertError> {
29 sys::convert(input.as_ref(), from_encoding, to_encoding)
30}
31
32#[doc = include_str!("../docs/convert_lossy.md")]
33pub fn convert_lossy(
34 input: impl AsRef<[u8]>,
35 from_encoding: &str,
36 to_encoding: &str,
37) -> Result<Vec<u8>, ConvertLossyError> {
38 sys::convert_lossy(input.as_ref(), from_encoding, to_encoding)
39}
40
41#[doc = include_str!("../docs/decode.md")]
42pub fn decode(input: impl AsRef<[u8]>, encoding: &str) -> Result<String, ConvertError> {
43 let mut input = input.as_ref();
44 try_strip_utf8_bom(&mut input, encoding);
45 sys::decode(input, encoding)
46}
47
48#[doc = include_str!("../docs/decode_lossy.md")]
49pub fn decode_lossy(input: impl AsRef<[u8]>, encoding: &str) -> Result<String, ConvertLossyError> {
50 let mut input = input.as_ref();
51 try_strip_utf8_bom(&mut input, encoding);
52 sys::decode_lossy(input, encoding)
53}
54
55fn try_strip_utf8_bom(input: &mut &[u8], encoding: &str) {
56 if let Ok(utf) = utf::UtfEncoding::from_str(encoding) {
57 utf.strip_bom(input);
58 }
59}