iconv_native/
lib.rs

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}