nushell/src/object/files.rs

55 lines
1.3 KiB
Rust
Raw Normal View History

2019-05-10 18:59:12 +02:00
use crate::errors::ShellError;
use crate::object::{SpannedDictBuilder, Value};
2019-07-09 06:31:26 +02:00
use crate::prelude::*;
2019-05-10 18:59:12 +02:00
#[derive(Debug)]
pub enum FileType {
Directory,
2019-05-10 18:59:12 +02:00
File,
Symlink,
}
2019-07-09 06:31:26 +02:00
crate fn dir_entry_dict(
entry: &std::fs::DirEntry,
span: impl Into<Span>,
) -> Result<Spanned<Value>, ShellError> {
let mut dict = SpannedDictBuilder::new(span);
let filename = entry.file_name();
2019-07-09 06:31:26 +02:00
dict.insert("file name", Value::string(filename.to_string_lossy()));
let metadata = entry.metadata()?;
let kind = if metadata.is_dir() {
FileType::Directory
} else if metadata.is_file() {
FileType::File
} else {
FileType::Symlink
};
2019-07-09 06:31:26 +02:00
dict.insert("file type", Value::string(format!("{:?}", kind)));
dict.insert(
"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-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-07-09 06:31:26 +02:00
Ok(dict.into_spanned_value())
2019-05-10 18:59:12 +02:00
}