ltrait_source_desktop/
icon.rs

1use crate::DesktopError;
2use std::path::Path;
3
4pub fn lookup(name: &str) -> Result<String, DesktopError> {
5    let icon = freedesktop_icons::lookup(name)
6        .find()
7        .ok_or_else(|| DesktopError::NoIcon(name.into()))?;
8
9    load_image(&icon)
10}
11
12// see also https://github.com/satler-git/sandbox/blob/bcab487f5d9c35e938132e2ed15d3c9db729a6a2/rust/icon-base64/src/main.rs
13fn load_image(path: &Path) -> Result<String, DesktopError> {
14    use base64::{Engine as _, engine::general_purpose};
15    use image::{ImageFormat, ImageReader};
16    use std::io::Cursor;
17
18    let img = ImageReader::open(path)
19        .map_err(DesktopError::OpenFile)?
20        .decode()
21        .map_err(DesktopError::ImageDecode)?;
22
23    let mut buff = Cursor::new(vec![]);
24
25    img.write_to(&mut buff, ImageFormat::Png)
26        .map_err(DesktopError::ImageDecode)?;
27
28    Ok(general_purpose::STANDARD.encode(buff.get_ref()))
29}