lla 0.1.7

A lightweight ls replacement
use crate::error::LlaError;
use crate::ls::LongLister;
use std::process::exit;
use std::{fs::Metadata, os::unix::prelude::MetadataExt, path::PathBuf};

pub fn get_file_type(metadata: &Metadata) -> String {
    let file_type = if metadata.is_file() {
        "file"
    } else if metadata.is_dir() {
        "dir"
    } else if metadata.file_type().is_symlink() {
        "link"
    } else {
        "other"
    };

    file_type.to_string()
}

pub struct LongFile {
    pub file_type: String,
    pub permissions: String,
    pub links: u64,
    pub user: String,
    pub group: String,
    pub size: u64,
    pub date: chrono::DateTime<chrono::Local>,
    pub name: String,
}

impl LongFile {
    pub fn new(file: &PathBuf) -> LongFile {
        let metadata = file
            .metadata()
            .map_err(|e| LlaError::FailedToGetMetadata(e.to_string()))
            .unwrap();
        let file_type = get_file_type(&metadata);
        let permissions = LongLister::new().get_file_permissions(&metadata);
        let links = metadata.nlink();
        let size = metadata.len();
        let date = chrono::DateTime::from(metadata.modified().unwrap());
        let name = file.file_name().unwrap().to_string_lossy().to_string();

        let user: String;
        let group: String;

        let u = LongLister::new().get_user_name(&metadata);
        if let Err(e) = u {
            eprintln!("{}", e);
            exit(1);
        } else {
            user = u.unwrap();
        }

        let g = LongLister::new().get_group_name(&metadata);
        if let Err(e) = g {
            eprintln!("{}", e);
            exit(1);
        } else {
            group = g.unwrap();
        }

        LongFile {
            file_type,
            permissions,
            links,
            user,
            group,
            size,
            date,
            name,
        }
    }
}