lla 0.5.5

Blazing Fast and highly customizable ls Replacement with Superpowers
#[derive(Clone, Debug, PartialEq, Eq)]
pub enum ColumnKey {
    Permissions,
    Size,
    Modified,
    Created,
    Accessed,
    User,
    Group,
    Name,
    Path,
    Plugins,
    CustomField(String),
}

pub fn parse_columns(values: &[String]) -> Vec<ColumnKey> {
    let mut columns: Vec<ColumnKey> = values
        .iter()
        .map(|value| ColumnKey::from_config(value))
        .collect();

    if columns.is_empty() {
        columns.push(ColumnKey::Name);
    }
    columns
}

impl ColumnKey {
    pub fn from_config(raw: &str) -> ColumnKey {
        let trimmed = raw.trim();
        if trimmed.is_empty() {
            return ColumnKey::Name;
        }
        if let Some(field) = trimmed.strip_prefix("field:") {
            return ColumnKey::CustomField(field.trim().to_string());
        }
        match trimmed.to_lowercase().as_str() {
            "permissions" | "perms" => ColumnKey::Permissions,
            "size" => ColumnKey::Size,
            "modified" | "modified_at" | "date" => ColumnKey::Modified,
            "created" => ColumnKey::Created,
            "accessed" | "access" => ColumnKey::Accessed,
            "user" | "owner" => ColumnKey::User,
            "group" => ColumnKey::Group,
            "name" => ColumnKey::Name,
            "path" => ColumnKey::Path,
            "plugins" | "plugin" => ColumnKey::Plugins,
            _ => ColumnKey::CustomField(trimmed.to_string()),
        }
    }

    pub fn align_right(&self) -> bool {
        matches!(self, ColumnKey::Size)
    }

    pub fn header_label(&self) -> String {
        match self {
            ColumnKey::Permissions => "Permissions".to_string(),
            ColumnKey::Size => "Size".to_string(),
            ColumnKey::Modified => "Modified".to_string(),
            ColumnKey::Created => "Created".to_string(),
            ColumnKey::Accessed => "Accessed".to_string(),
            ColumnKey::User => "User".to_string(),
            ColumnKey::Group => "Group".to_string(),
            ColumnKey::Name => "Name".to_string(),
            ColumnKey::Path => "Path".to_string(),
            ColumnKey::Plugins => "Plugins".to_string(),
            ColumnKey::CustomField(field) => field.clone(),
        }
    }

    pub fn is_group(&self) -> bool {
        matches!(self, ColumnKey::Group)
    }

    pub fn is_plugins(&self) -> bool {
        matches!(self, ColumnKey::Plugins)
    }
}