59 lines
1.6 KiB
Rust
59 lines
1.6 KiB
Rust
|
use std::{env, ffi::OsString, fs};
|
||
|
|
||
|
const ICON_FILE_EXTENSION: &'static str = ".svg";
|
||
|
pub const ICON_FILE_EXTENSION_LEN: usize = ICON_FILE_EXTENSION.len();
|
||
|
|
||
|
pub struct Icons {
|
||
|
icons_dir_path: String,
|
||
|
icon_filenames: Vec<OsString>,
|
||
|
}
|
||
|
|
||
|
impl Icons {
|
||
|
/// Build the Icons (handler) struct
|
||
|
///
|
||
|
/// Returns a result with the Icons struct or an error message
|
||
|
pub fn build() -> Result<Self, &'static str> {
|
||
|
let icons_dir_arg = env::args()
|
||
|
.nth(1)
|
||
|
.unwrap_or(String::from("vendor/lucide/icons"));
|
||
|
|
||
|
let icon_dir = match fs::read_dir(&icons_dir_arg) {
|
||
|
Ok(dir) => dir,
|
||
|
Err(_) => return Err("Failed to read icon directory"),
|
||
|
};
|
||
|
|
||
|
let icon_filenames: Vec<_> = icon_dir
|
||
|
.map(|entry| entry.unwrap().file_name())
|
||
|
.filter(|entry| entry.to_str().unwrap_or("").ends_with(".svg"))
|
||
|
.collect();
|
||
|
|
||
|
Ok(Icons {
|
||
|
icons_dir_path: icons_dir_arg,
|
||
|
icon_filenames,
|
||
|
})
|
||
|
}
|
||
|
|
||
|
pub fn has_filename(&self, icon: &str) -> bool {
|
||
|
self.icon_filenames.contains(&OsString::from(icon))
|
||
|
}
|
||
|
|
||
|
pub fn has_iconname(&self, icon: &str) -> bool {
|
||
|
self.icon_filenames
|
||
|
.iter()
|
||
|
.find(|&i| match i.to_str() {
|
||
|
Some(i) => &i[..i.len() - ICON_FILE_EXTENSION_LEN] == icon,
|
||
|
None => false,
|
||
|
})
|
||
|
.is_some()
|
||
|
}
|
||
|
|
||
|
pub fn icons_len(&self) -> usize {
|
||
|
self.icon_filenames.len()
|
||
|
}
|
||
|
|
||
|
pub fn get_icon(&self, icon: &str) -> Option<Vec<u8>> {
|
||
|
let icon_path = format!("{}/{}.svg", self.icons_dir_path, icon);
|
||
|
fs::read(icon_path).ok()
|
||
|
}
|
||
|
}
|