windows-icons 0.3.0

A simple library to extract icons from files on Windows
mod utils {
    pub mod image_utils;
    pub mod process_utils;
}
mod dll_icons;
mod uwp_apps;

pub use dll_icons::DllIcon;
use dll_icons::get_dll_hicon_to_image;
use utils::image_utils::{get_hicon_to_image, image_to_base64};
use utils::process_utils::get_process_path;
use uwp_apps::{get_uwp_icon, get_uwp_icon_base64};

use std::{error::Error, path::Path};

use image::RgbaImage;

fn is_uwp_app(path: &Path) -> bool {
    let is_uwp = path.to_string_lossy().contains("Programme/WindowsApps");

    let is_wsa = path
        .to_string_lossy()
        .contains("WindowsSubsystemForAndroid");

    is_uwp && !is_wsa
}

pub fn get_icon_by_path<P: AsRef<Path>>(path: P) -> Result<RgbaImage, Box<dyn Error>> {
    let path = path.as_ref();
    if is_uwp_app(path) {
        get_uwp_icon(path)
    } else {
        get_hicon_to_image(path)
    }
}

pub fn get_icon_base64_by_path<P: AsRef<Path>>(path: P) -> Result<String, Box<dyn Error>> {
    let path = path.as_ref();
    if is_uwp_app(path) {
        get_uwp_icon_base64(path)
    } else {
        let icon_image = get_icon_by_path(path)?;
        image_to_base64(icon_image)
    }
}

pub fn get_icon_by_process_id(process_id: u32) -> Result<RgbaImage, Box<dyn Error>> {
    let process_path = get_process_path(process_id)?;
    get_icon_by_path(&process_path)
}

pub fn get_icon_base64_by_process_id(process_id: u32) -> Result<String, Box<dyn Error>> {
    let process_path = get_process_path(process_id)?;
    get_icon_base64_by_path(&process_path)
}

pub fn get_icon_by_dll(dll_icon: DllIcon) -> Result<RgbaImage, Box<dyn Error>> {
    get_dll_hicon_to_image(dll_icon)
}

pub fn get_icon_base64_by_dll(dll_icon: DllIcon) -> Result<String, Box<dyn Error>> {
    let dll_image = get_icon_by_dll(dll_icon)?;
    image_to_base64(dll_image)
}