slint-ui-templates 0.1.0

Composable Slint UI building blocks — mother-child pattern, token-driven
Documentation
/// Rust-side mirror of ui/tokens/fluent/icons.slint.
/// Accepts icon name enum and returns Segoe Fluent Icons codepoints.

use std::str::FromStr;

/// Strongly-typed icon names from the Fluent icon set.
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
/// I co nn am e enum.
pub enum IconName {
    Home,
    Settings,
    List,
    Add,
    Delete,
    Edit,
    Save,
    Search,
    Menu,
    Close,
    Back,
    Forward,
    Refresh,
    Folder,
    File,
    Copy,
    Paste,
    Cut,
    Undo,
    Redo,
    Info,
    Warning,
    Error,
    Check,
    Star,
    Heart,
    Pin,
    Share,
    Download,
    Upload,
    Cloud,
    User,
    People,
    Mail,
    Calendar,
    Clock,
    Notification,
    Chat,
    Phone,
    Camera,
    Image,
    Video,
    Music,
    Apps,
    Grid,
    Layout,
    PanelLeft,
    Filter,
    Sort,
    ZoomIn,
    ZoomOut,
    Lock,
    Unlock,
    Tag,
    Flag,
    Print,
    Code,
}

/// Static lookup table mapping kebab-case names to `IconName` variants.
const ICON_TABLE: &[(&str, IconName)] = &[
    ("add",          IconName::Add),
    ("apps",         IconName::Apps),
    ("back",         IconName::Back),
    ("calendar",     IconName::Calendar),
    ("camera",       IconName::Camera),
    ("chat",         IconName::Chat),
    ("check",        IconName::Check),
    ("clock",        IconName::Clock),
    ("close",        IconName::Close),
    ("cloud",        IconName::Cloud),
    ("code",         IconName::Code),
    ("copy",         IconName::Copy),
    ("cut",          IconName::Cut),
    ("delete",       IconName::Delete),
    ("download",     IconName::Download),
    ("edit",         IconName::Edit),
    ("error",        IconName::Error),
    ("file",         IconName::File),
    ("filter",       IconName::Filter),
    ("flag",         IconName::Flag),
    ("folder",       IconName::Folder),
    ("forward",      IconName::Forward),
    ("grid",         IconName::Grid),
    ("heart",        IconName::Heart),
    ("home",         IconName::Home),
    ("image",        IconName::Image),
    ("info",         IconName::Info),
    ("layout",       IconName::Layout),
    ("list",         IconName::List),
    ("lock",         IconName::Lock),
    ("mail",         IconName::Mail),
    ("menu",         IconName::Menu),
    ("music",        IconName::Music),
    ("notification", IconName::Notification),
    ("panel-left",   IconName::PanelLeft),
    ("paste",        IconName::Paste),
    ("people",       IconName::People),
    ("phone",        IconName::Phone),
    ("pin",          IconName::Pin),
    ("print",        IconName::Print),
    ("redo",         IconName::Redo),
    ("refresh",      IconName::Refresh),
    ("save",         IconName::Save),
    ("search",       IconName::Search),
    ("settings",     IconName::Settings),
    ("share",        IconName::Share),
    ("sort",         IconName::Sort),
    ("star",         IconName::Star),
    ("tag",          IconName::Tag),
    ("undo",         IconName::Undo),
    ("unlock",       IconName::Unlock),
    ("upload",       IconName::Upload),
    ("user",         IconName::User),
    ("video",        IconName::Video),
    ("warning",      IconName::Warning),
    ("zoom-in",      IconName::ZoomIn),
    ("zoom-out",     IconName::ZoomOut),
];

impl FromStr for IconName {
    type Err = ();

    fn from_str(s: &str) -> Result<Self, Self::Err> {
        ICON_TABLE
            .binary_search_by_key(&s, |(name, _)| name)
            .map(|i| ICON_TABLE[i].1)
            .map_err(|_| ())
    }
}

/// Look up the Segoe Fluent Icons codepoint for an icon name string.
/// Returns `None` if the name is not recognized.
pub fn fluent_icon(name: &str) -> Option<&'static str> {
    Some(match IconName::from_str(name).ok()? {
        IconName::Home         => "\u{E80F}",
        IconName::Settings     => "\u{E713}",
        IconName::List         => "\u{E8FD}",
        IconName::Add          => "\u{E710}",
        IconName::Delete       => "\u{E74D}",
        IconName::Edit         => "\u{E70F}",
        IconName::Save         => "\u{E74E}",
        IconName::Search       => "\u{E721}",
        IconName::Menu         => "\u{E700}",
        IconName::Close        => "\u{E8BB}",
        IconName::Back         => "\u{E72B}",
        IconName::Forward      => "\u{E72A}",
        IconName::Refresh      => "\u{E72C}",
        IconName::Folder       => "\u{E8B7}",
        IconName::File         => "\u{E7C3}",
        IconName::Copy         => "\u{E8C8}",
        IconName::Paste        => "\u{E77F}",
        IconName::Cut          => "\u{E8C6}",
        IconName::Undo         => "\u{E7A7}",
        IconName::Redo         => "\u{E7A6}",
        IconName::Info         => "\u{E946}",
        IconName::Warning      => "\u{E7BA}",
        IconName::Error        => "\u{E783}",
        IconName::Check        => "\u{E73E}",
        IconName::Star         => "\u{E734}",
        IconName::Heart        => "\u{EB51}",
        IconName::Pin          => "\u{E718}",
        IconName::Share        => "\u{E72D}",
        IconName::Download     => "\u{E896}",
        IconName::Upload       => "\u{E898}",
        IconName::Cloud        => "\u{E753}",
        IconName::User         => "\u{E77B}",
        IconName::People       => "\u{E716}",
        IconName::Mail         => "\u{E715}",
        IconName::Calendar     => "\u{E787}",
        IconName::Clock        => "\u{E823}",
        IconName::Notification => "\u{EA8F}",
        IconName::Chat         => "\u{E8BD}",
        IconName::Phone        => "\u{E717}",
        IconName::Camera       => "\u{E722}",
        IconName::Image        => "\u{EB9F}",
        IconName::Video        => "\u{E714}",
        IconName::Music        => "\u{EC4F}",
        IconName::Apps         => "\u{E71A}",
        IconName::Grid         => "\u{E80A}",
        IconName::Layout       => "\u{E8A1}",
        IconName::PanelLeft    => "\u{EE49}",
        IconName::Filter       => "\u{E71C}",
        IconName::Sort         => "\u{E8CB}",
        IconName::ZoomIn       => "\u{E8A3}",
        IconName::ZoomOut      => "\u{E71F}",
        IconName::Lock         => "\u{E72E}",
        IconName::Unlock       => "\u{E785}",
        IconName::Tag          => "\u{E8EC}",
        IconName::Flag         => "\u{E7C1}",
        IconName::Print        => "\u{E749}",
        IconName::Code         => "\u{E943}",
    })
}