ltrait_source_desktop/
icon.rs1use 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
12fn 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}