fn text_decode()

in wasm/wasm-sharding-js/src/internal_module/encoding.rs [141:312]


fn text_decode(ctx: &mut Context, _: JsValue, params: &[JsValue]) -> JsValue {
    let s = params.get(0);
    let utf_label = match params.get(1).clone() {
        Some(JsValue::String(s)) => s.as_str(),
        _ => "",
    };
    let fatal = match params.get(2) {
        Some(JsValue::Bool(b)) => *b,
        _ => false,
    };

    if s.is_none() {
        return JsValue::UnDefined;
    }

    let trap = if fatal {
        DecoderTrap::Strict
    } else {
        DecoderTrap::Replace
    };

    fn ret_to_js(ctx: &mut Context, ret: Result<String, Cow<str>>) -> JsValue {
        match &ret {
            Ok(s) => ctx.new_string(s).into(),
            Err(e) => ctx.new_error(e).into(),
        }
    }

    if let JsValue::ArrayBuffer(s) = s.unwrap() {
        match utf_label {
            "" | "utf8" | "utf-8" => {
                let b = UTF_8.decode(s.as_ref(), trap);
                ret_to_js(ctx, b)
            }
            "gbk" => {
                let b = GBK.decode(s.as_ref(), trap);
                ret_to_js(ctx, b)
            }
            "gb18030" => {
                let b = GB18030.decode(s.as_ref(), trap);
                ret_to_js(ctx, b)
            }
            "hz-gb-2312" => {
                let b = HZ.decode(s.as_ref(), trap);
                ret_to_js(ctx, b)
            }
            "big5" => {
                let b = BIG5_2003.decode(s.as_ref(), trap);
                ret_to_js(ctx, b)
            }
            "euc-jp" => {
                let b = EUC_JP.decode(s.as_ref(), trap);
                ret_to_js(ctx, b)
            }
            "iso-2022-jp" => {
                let b = ISO_2022_JP.decode(s.as_ref(), trap);
                ret_to_js(ctx, b)
            }
            "utf-16be" => {
                let b = UTF_16BE.decode(s.as_ref(), trap);
                ret_to_js(ctx, b)
            }
            "utf-16le" => {
                let b = UTF_16LE.decode(s.as_ref(), trap);
                ret_to_js(ctx, b)
            }
            "x-user-defined" => {
                let b = X_USER_DEFINED.decode(s.as_ref(), trap);
                ret_to_js(ctx, b)
            }
            "ibm866" => {
                let b = IBM866.decode(s.as_ref(), trap);
                ret_to_js(ctx, b)
            }
            "iso-8859-2" => {
                let b = ISO_8859_2.decode(s.as_ref(), trap);
                ret_to_js(ctx, b)
            }
            "iso-8859-3" => {
                let b = ISO_8859_3.decode(s.as_ref(), trap);
                ret_to_js(ctx, b)
            }
            "iso-8859-4" => {
                let b = ISO_8859_4.decode(s.as_ref(), trap);
                ret_to_js(ctx, b)
            }
            "iso-8859-5" => {
                let b = ISO_8859_5.decode(s.as_ref(), trap);
                ret_to_js(ctx, b)
            }
            "iso-8859-6" => {
                let b = ISO_8859_6.decode(s.as_ref(), trap);
                ret_to_js(ctx, b)
            }
            "iso-8859-7" => {
                let b = ISO_8859_7.decode(s.as_ref(), trap);
                ret_to_js(ctx, b)
            }
            "iso-8859-8" => {
                let b = ISO_8859_8.decode(s.as_ref(), trap);
                ret_to_js(ctx, b)
            }
            "iso-8859-8i" => {
                let b = ISO_8859_8_I.decode(s.as_ref(), trap);
                ret_to_js(ctx, b)
            }
            "iso-8859-10" => {
                let b = ISO_8859_10.decode(s.as_ref(), trap);
                ret_to_js(ctx, b)
            }
            "iso-8859-13" => {
                let b = ISO_8859_13.decode(s.as_ref(), trap);
                ret_to_js(ctx, b)
            }
            "iso-8859-14" => {
                let b = ISO_8859_14.decode(s.as_ref(), trap);
                ret_to_js(ctx, b)
            }
            "iso-8859-15" => {
                let b = ISO_8859_15.decode(s.as_ref(), trap);
                ret_to_js(ctx, b)
            }
            "iso-8859-16" => {
                let b = ISO_8859_16.decode(s.as_ref(), trap);
                ret_to_js(ctx, b)
            }
            "windows-874" => {
                let b = WINDOWS_874.decode(s.as_ref(), trap);
                ret_to_js(ctx, b)
            }
            "windows-1250" => {
                let b = WINDOWS_1250.decode(s.as_ref(), trap);
                ret_to_js(ctx, b)
            }
            "windows-1251" => {
                let b = WINDOWS_1251.decode(s.as_ref(), trap);
                ret_to_js(ctx, b)
            }
            "windows-1252" => {
                let b = WINDOWS_1252.decode(s.as_ref(), trap);
                ret_to_js(ctx, b)
            }
            "windows-1253" => {
                let b = WINDOWS_1253.decode(s.as_ref(), trap);
                ret_to_js(ctx, b)
            }
            "windows-1254" => {
                let b = WINDOWS_1254.decode(s.as_ref(), trap);
                ret_to_js(ctx, b)
            }
            "windows-1255" => {
                let b = WINDOWS_1255.decode(s.as_ref(), trap);
                ret_to_js(ctx, b)
            }
            "windows-1256" => {
                let b = WINDOWS_1256.decode(s.as_ref(), trap);
                ret_to_js(ctx, b)
            }
            "windows-1257" => {
                let b = WINDOWS_1257.decode(s.as_ref(), trap);
                ret_to_js(ctx, b)
            }
            "windows-1258" => {
                let b = WINDOWS_1258.decode(s.as_ref(), trap);
                ret_to_js(ctx, b)
            }
            _ => JsValue::UnDefined,
        }
    } else {
        JsValue::UnDefined
    }
}