use std::collections::HashMap;
use std::error::Error;
mod mode;
pub use mode::Mode;
mod folder;
pub use folder::Folder;
mod create;
pub use create::Create;
mod document_error;
pub use document_error::DocumentError;
mod document;
pub use document::Document;
mod filesystem_entity;
pub use filesystem_entity::FileSystemEntity;
mod document_map;
pub use document_map::DocumentMap;
mod into_result;
pub use into_result::IntoResult;
pub fn with<Closure, Return>(documents: &[Result<Document, Box<dyn Error>>], closure: Closure)
where
Closure: FnOnce(DocumentMap) -> Return,
Return: IntoResult,
{
let mut document_map = HashMap::new();
for document_result in documents {
let document = match document_result {
Ok(document) => (*document).clone(),
Err(error) => {
eprintln!("{}", error);
return;
}
};
let document_alias = document.alias.clone();
if document_alias != "_" {
document_map.insert(document_alias, document);
}
}
match closure(DocumentMap(document_map)).into_result() {
Ok(_) => {}
Err(error) => eprintln!("{error}"),
}
}
pub mod prelude {
#[allow(unused_imports)]
pub use crate::{
create::Create,
document::{Document, LinesBufReaderFileExt, ResultDocumentBoxErrorExt},
filesystem_entity::FileSystemEntity,
folder::{
Folder::{self, Project, User},
Project::{Config, Data},
User::{Documents, Downloads, Home, Pictures, Videos},
},
mode::Mode,
with,
};
}
#[cfg(test)]
mod test {
use std::path::PathBuf;
use super::prelude::*;
#[test]
fn test1() {
with(
&[
Document::at(User(Pictures(&[])), "1.png", Create::No),
Document::at(User(Pictures(&[])), "42-44.png", Create::No),
Document::at(
User(Pictures(&["Movie Trailer"])),
"thumbnail.png",
Create::No,
)
.alias("pic"),
Document::at(User(Downloads(&[])), "file.txt", Create::No),
],
|mut d| {
for (alias, doc) in d.clone() {
println!("{alias}: {doc:?}");
}
println!("{}", d["1.png"].name());
d["pic"].launch_with_default_app()?;
d["file.txt"]
.append(b"Something\nto be added")?
.launch_with_default_app()?
.lines()?
.print()?;
Ok(())
},
);
}
#[test]
fn test2() {
let a: &[&dyn FileSystemEntity] = &[
&Document::at(User(Pictures(&[""])), "pic", Create::No),
&User(Pictures(&[""])),
&Project(Data(&[]).with_id("qualifier", "organization", "application")),
&PathBuf::new(),
];
for b in a {
println!(
"{:?} {} exist.",
b,
if b.exists() { "does" } else { "doesn't" }
);
}
}
}