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}