ltrait_source_desktop/
icon.rs

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