Make the lib work on strings and not on the filesystem

This commit is contained in:
Zykino 2019-09-19 14:02:30 +02:00
parent 803b1cf46c
commit 1651f24ce7
3 changed files with 41 additions and 19 deletions

View File

@ -13,16 +13,17 @@ $ cbb comic/
You may want to customize the number of leading 0, it is useful when you plan on adding more pages later. You may want to customize the number of leading 0, it is useful when you plan on adding more pages later.
``` ```
$ cbb comic/ --pad=3 --dry-run $ cbb comic/ --pad=3 --dry-run
7.txt -> 07.txt 1.png -> 001.png
10.txt -> 10.txt 8.png -> 008.png
5.txt -> 05.txt 3.png -> 003.png
3.txt -> 03.txt 4.png -> 004.png
4.txt -> 04.txt 6.png -> 006.png
8.txt -> 08.txt 2.png -> 002.png
2.txt -> 02.txt 9.png -> 009.png
6.txt -> 06.txt 5.png -> 005.png
1.txt -> 01.txt 11.png -> 011.png
9.txt -> 09.txt 7.png -> 007.png
10.png -> 010.png
``` ```
# TODO # TODO

View File

@ -1,5 +1,4 @@
use std::ffi::OsString; use std::ffi::OsString;
use std::fs::ReadDir;
use std::path::PathBuf; use std::path::PathBuf;
use regex::Regex; use regex::Regex;
@ -91,15 +90,16 @@ pub struct ComicBook {
} }
impl ComicBook { impl ComicBook {
pub fn new(files: ReadDir, pad: Option<usize>) -> ComicBook { pub fn new(files: Vec<String>, pad: Option<usize>) -> ComicBook {
let regex = Regex::new(r"\./(?P<prefix>\D*)(?P<number>\d*)(?P<suffix>.*)").unwrap(); let regex = Regex::new(r"(?P<prefix>\D*)(?P<number>\d*)(?P<suffix>.*)").unwrap();
ComicBook { ComicBook {
pad, pad,
pages: files pages: files
.map(|entry| entry.unwrap().path()) .iter()
.filter(|entry| entry.is_file())
.map(|entry| { .map(|entry| {
let caps = regex.captures(entry.to_str().unwrap()).unwrap(); dbg!(entry.as_str());
let caps = dbg!(regex.captures(entry.as_str())).unwrap();
Page::new( Page::new(
String::from(caps.name("prefix").map_or("", |c| c.as_str())), String::from(caps.name("prefix").map_or("", |c| c.as_str())),
String::from(&caps["number"]), // FIXME => ignore the file? String::from(&caps["number"]), // FIXME => ignore the file?

View File

@ -8,6 +8,7 @@ use cbb::Opt;
use std::env; use std::env;
use std::fs; use std::fs;
use std::path::Path;
fn main() { fn main() {
let opt = Opt::new(env::args()); let opt = Opt::new(env::args());
@ -19,8 +20,28 @@ fn main() {
// unimplemented!(); // unimplemented!();
// } // }
env::set_current_dir(opt.comic_folder).unwrap(); // TODO: improve the error message with a the name of the directory (use format)
let mut book = ComicBook::new(fs::read_dir(".").unwrap(), opt.pad); env::set_current_dir(opt.comic_folder)
.expect("Impossible to set current directory to targeted");
let paths = fs::read_dir(&Path::new(&env::current_dir().unwrap())).unwrap();
let files = paths
.filter_map(|entry| {
let entry = entry.unwrap();
// We want the name of the files in the directory. If the entry is not a file we do not need to fetch its filename.
if entry.file_type().unwrap().is_file() {
let file_name = entry.file_name();
let file_name_as_str = file_name.to_str().unwrap();
let file_name_as_string = String::from(file_name_as_str);
Some(file_name_as_string)
} else {
None
}
})
.collect::<Vec<String>>();
let mut book = ComicBook::new(files, opt.pad);
let bind_func = if opt.dry_run { dry_run } else { rename }; let bind_func = if opt.dry_run { dry_run } else { rename };
book.bind(bind_func); book.bind(bind_func);
@ -34,5 +55,5 @@ fn dry_run(original: String, new: String) {
} }
fn rename(original: String, new: String) { fn rename(original: String, new: String) {
fs::rename(original, new).expect("RENAME FAILED"); fs::rename(original, new).expect("Rename failed");
} }