2019-09-05 18:23:42 +02:00
|
|
|
use crate::data::{TaggedDictBuilder, Value};
|
2019-05-10 18:59:12 +02:00
|
|
|
use crate::errors::ShellError;
|
2019-07-09 06:31:26 +02:00
|
|
|
use crate::prelude::*;
|
2019-05-10 18:59:12 +02:00
|
|
|
|
|
|
|
#[derive(Debug)]
|
|
|
|
pub enum FileType {
|
2019-05-15 20:14:51 +02:00
|
|
|
Directory,
|
2019-05-10 18:59:12 +02:00
|
|
|
File,
|
|
|
|
Symlink,
|
|
|
|
}
|
|
|
|
|
2019-08-29 13:08:28 +02:00
|
|
|
pub(crate) fn dir_entry_dict(
|
2019-08-02 05:10:06 +02:00
|
|
|
filename: &std::path::Path,
|
|
|
|
metadata: &std::fs::Metadata,
|
2019-08-05 10:54:29 +02:00
|
|
|
tag: impl Into<Tag>,
|
2019-08-01 03:58:42 +02:00
|
|
|
) -> Result<Tagged<Value>, ShellError> {
|
2019-08-05 10:54:29 +02:00
|
|
|
let mut dict = TaggedDictBuilder::new(tag);
|
2019-07-14 06:59:36 +02:00
|
|
|
dict.insert("name", Value::string(filename.to_string_lossy()));
|
2019-05-15 23:44:06 +02:00
|
|
|
|
|
|
|
let kind = if metadata.is_dir() {
|
|
|
|
FileType::Directory
|
|
|
|
} else if metadata.is_file() {
|
|
|
|
FileType::File
|
|
|
|
} else {
|
|
|
|
FileType::Symlink
|
|
|
|
};
|
|
|
|
|
2019-07-14 06:59:36 +02:00
|
|
|
dict.insert("type", Value::string(format!("{:?}", kind)));
|
2019-07-09 06:31:26 +02:00
|
|
|
dict.insert(
|
2019-05-15 23:44:06 +02:00
|
|
|
"readonly",
|
|
|
|
Value::boolean(metadata.permissions().readonly()),
|
|
|
|
);
|
|
|
|
|
2019-07-09 06:31:26 +02:00
|
|
|
dict.insert("size", Value::bytes(metadata.len() as u64));
|
2019-05-15 23:44:06 +02:00
|
|
|
|
2019-05-17 17:30:10 +02:00
|
|
|
match metadata.created() {
|
2019-07-09 06:31:26 +02:00
|
|
|
Ok(c) => dict.insert("created", Value::system_date(c)),
|
2019-05-17 17:30:10 +02:00
|
|
|
Err(_) => {}
|
|
|
|
}
|
|
|
|
|
|
|
|
match metadata.accessed() {
|
2019-07-09 06:31:26 +02:00
|
|
|
Ok(a) => dict.insert("accessed", Value::system_date(a)),
|
2019-05-17 17:30:10 +02:00
|
|
|
Err(_) => {}
|
|
|
|
}
|
|
|
|
|
|
|
|
match metadata.modified() {
|
2019-07-09 06:31:26 +02:00
|
|
|
Ok(m) => dict.insert("modified", Value::system_date(m)),
|
2019-05-17 17:30:10 +02:00
|
|
|
Err(_) => {}
|
|
|
|
}
|
2019-05-15 23:44:06 +02:00
|
|
|
|
2019-08-01 03:58:42 +02:00
|
|
|
Ok(dict.into_tagged_value())
|
2019-05-10 18:59:12 +02:00
|
|
|
}
|