Skip to main content

i_slint_compiler/
data_uri.rs

1// Copyright © SixtyFPS GmbH <info@slint.dev>
2// SPDX-License-Identifier: GPL-3.0-only OR LicenseRef-Slint-Royalty-free-2.0 OR LicenseRef-Slint-Software-3.0
3
4fn extract_extension_from_media_type(media_type: &str) -> String {
5    let subtype = media_type.strip_prefix("image/").unwrap_or(media_type);
6    let subtype = subtype.split(';').next().unwrap_or(subtype);
7    if subtype.starts_with("svg") { "svg".to_string() } else { subtype.to_string() }
8}
9
10pub fn decode_data_uri(data_uri: &str) -> Result<(Vec<u8>, String), String> {
11    let data_url =
12        data_url::DataUrl::process(data_uri).map_err(|e| format!("Invalid data URI: {e}"))?;
13
14    let media_type = data_url.mime_type();
15    if !media_type.matches("image", &media_type.subtype) {
16        return Err(format!(
17            "Unsupported media type: {}. Only image/* data URLs are supported",
18            media_type
19        ));
20    }
21
22    let extension = extract_extension_from_media_type(&media_type.to_string());
23
24    let (decoded_data, _) =
25        data_url.decode_to_vec().map_err(|e| format!("Invalid data URI payload: {e}"))?;
26
27    Ok((decoded_data, extension))
28}