@@ -3,11 +3,12 @@ use std::env; | |||||
use gutenberg::errors::Result; | use gutenberg::errors::Result; | ||||
use gutenberg::Site; | use gutenberg::Site; | ||||
use console; | |||||
pub fn build(config_file: &str) -> Result<()> { | pub fn build(config_file: &str) -> Result<()> { | ||||
let mut site = Site::new(env::current_dir().unwrap(), config_file)?; | let mut site = Site::new(env::current_dir().unwrap(), config_file)?; | ||||
site.load()?; | site.load()?; | ||||
super::notify_site_size(&site); | |||||
super::warn_about_ignored_pages(&site); | |||||
console::notify_site_size(&site); | |||||
console::warn_about_ignored_pages(&site); | |||||
site.build() | site.build() | ||||
} | } |
@@ -5,29 +5,3 @@ mod serve; | |||||
pub use self::init::create_new_project; | pub use self::init::create_new_project; | ||||
pub use self::build::build; | pub use self::build::build; | ||||
pub use self::serve::serve; | pub use self::serve::serve; | ||||
use gutenberg::Site; | |||||
use console::warn; | |||||
fn notify_site_size(site: &Site) { | |||||
println!( | |||||
"-> Creating {} pages ({} orphan) and {} sections", | |||||
site.pages.len(), | |||||
site.get_all_orphan_pages().len(), | |||||
site.sections.len() - 1, // -1 since we do not the index as a section | |||||
); | |||||
} | |||||
fn warn_about_ignored_pages(site: &Site) { | |||||
let ignored_pages = site.get_ignored_pages(); | |||||
if !ignored_pages.is_empty() { | |||||
warn(&format!( | |||||
"{} page(s) ignored (missing date or order in a sorted section):", | |||||
ignored_pages.len() | |||||
)); | |||||
for path in site.get_ignored_pages() { | |||||
warn(&format!("- {}", path.display())); | |||||
} | |||||
} | |||||
} |
@@ -13,11 +13,8 @@ use ws::{WebSocket, Sender, Message}; | |||||
use gutenberg::Site; | use gutenberg::Site; | ||||
use gutenberg::errors::{Result, ResultExt}; | use gutenberg::errors::{Result, ResultExt}; | ||||
use ::{report_elapsed_time, unravel_errors}; | |||||
use console; | use console; | ||||
#[derive(Debug, PartialEq)] | #[derive(Debug, PartialEq)] | ||||
enum ChangeKind { | enum ChangeKind { | ||||
Content, | Content, | ||||
@@ -47,7 +44,7 @@ fn rebuild_done_handling(broadcaster: &Sender, res: Result<()>, reload_path: &st | |||||
}}"#, reload_path) | }}"#, reload_path) | ||||
).unwrap(); | ).unwrap(); | ||||
}, | }, | ||||
Err(e) => unravel_errors("Failed to build the site", &e, false) | |||||
Err(e) => console::unravel_errors("Failed to build the site", &e) | |||||
} | } | ||||
} | } | ||||
@@ -67,10 +64,10 @@ pub fn serve(interface: &str, port: &str, config_file: &str) -> Result<()> { | |||||
site.load()?; | site.load()?; | ||||
site.enable_live_reload(); | site.enable_live_reload(); | ||||
super::notify_site_size(&site); | |||||
super::warn_about_ignored_pages(&site); | |||||
console::notify_site_size(&site); | |||||
console::warn_about_ignored_pages(&site); | |||||
site.build()?; | site.build()?; | ||||
report_elapsed_time(start); | |||||
console::report_elapsed_time(start); | |||||
// Setup watchers | // Setup watchers | ||||
let (tx, rx) = channel(); | let (tx, rx) = channel(); | ||||
@@ -154,7 +151,7 @@ pub fn serve(interface: &str, port: &str, config_file: &str) -> Result<()> { | |||||
} | } | ||||
}, | }, | ||||
}; | }; | ||||
report_elapsed_time(start); | |||||
console::report_elapsed_time(start); | |||||
} | } | ||||
_ => {} | _ => {} | ||||
} | } | ||||
@@ -1,6 +1,12 @@ | |||||
use std::time::Instant; | |||||
use chrono::Duration; | |||||
use term_painter::ToStyle; | use term_painter::ToStyle; | ||||
use term_painter::Color::*; | use term_painter::Color::*; | ||||
use gutenberg::errors::Error; | |||||
use gutenberg::Site; | |||||
pub fn info(message: &str) { | pub fn info(message: &str) { | ||||
println!("{}", NotSet.bold().paint(message)); | println!("{}", NotSet.bold().paint(message)); | ||||
@@ -17,3 +23,48 @@ pub fn success(message: &str) { | |||||
pub fn error(message: &str) { | pub fn error(message: &str) { | ||||
println!("{}", Red.bold().paint(message)); | println!("{}", Red.bold().paint(message)); | ||||
} | } | ||||
/// Display in the console the number of pages/sections in the site | |||||
pub fn notify_site_size(site: &Site) { | |||||
println!( | |||||
"-> Creating {} pages ({} orphan) and {} sections", | |||||
site.pages.len(), | |||||
site.get_all_orphan_pages().len(), | |||||
site.sections.len() - 1, // -1 since we do not the index as a section | |||||
); | |||||
} | |||||
/// Display a warning in the console if there are ignored pages in the site | |||||
pub fn warn_about_ignored_pages(site: &Site) { | |||||
let ignored_pages = site.get_ignored_pages(); | |||||
if !ignored_pages.is_empty() { | |||||
warn(&format!( | |||||
"{} page(s) ignored (missing date or order in a sorted section):", | |||||
ignored_pages.len() | |||||
)); | |||||
for path in site.get_ignored_pages() { | |||||
warn(&format!("- {}", path.display())); | |||||
} | |||||
} | |||||
} | |||||
/// Print the time elapsed rounded to 1 decimal | |||||
pub fn report_elapsed_time(instant: Instant) { | |||||
let duration_ms = Duration::from_std(instant.elapsed()).unwrap().num_milliseconds() as f64; | |||||
if duration_ms < 1000.0 { | |||||
success(&format!("Done in {}ms.\n", duration_ms)); | |||||
} else { | |||||
let duration_sec = duration_ms / 1000.0; | |||||
success(&format!("Done in {:.1}s.\n", ((duration_sec * 10.0).round() / 10.0))); | |||||
} | |||||
} | |||||
/// Display an error message and the actual error(s) | |||||
pub fn unravel_errors(message: &str, error: &Error) { | |||||
self::error(message); | |||||
self::error(&format!("Error: {}", error)); | |||||
for e in error.iter().skip(1) { | |||||
self::error(&format!("Reason: {}", e)); | |||||
} | |||||
} |
@@ -12,41 +12,12 @@ extern crate mount; | |||||
extern crate notify; | extern crate notify; | ||||
extern crate ws; | extern crate ws; | ||||
use std::time::Instant; | use std::time::Instant; | ||||
use chrono::Duration; | |||||
use gutenberg::errors::Error; | |||||
mod cmd; | mod cmd; | ||||
mod console; | mod console; | ||||
/// Print the time elapsed rounded to 1 decimal | |||||
fn report_elapsed_time(instant: Instant) { | |||||
let duration_ms = Duration::from_std(instant.elapsed()).unwrap().num_milliseconds() as f64; | |||||
if duration_ms < 1000.0 { | |||||
console::success(&format!("Done in {}ms.\n", duration_ms)); | |||||
} else { | |||||
let duration_sec = duration_ms / 1000.0; | |||||
console::success(&format!("Done in {:.1}s.\n", ((duration_sec * 10.0).round() / 10.0))); | |||||
} | |||||
} | |||||
////Display an error message, the actual error and then exits if requested | |||||
fn unravel_errors(message: &str, error: &Error, exit: bool) { | |||||
console::error(message); | |||||
console::error(&format!("Error: {}", error)); | |||||
for e in error.iter().skip(1) { | |||||
console::error(&format!("Reason: {}", e)); | |||||
} | |||||
if exit { | |||||
::std::process::exit(1); | |||||
} | |||||
} | |||||
fn main() { | fn main() { | ||||
let matches = clap_app!(Gutenberg => | let matches = clap_app!(Gutenberg => | ||||
(version: crate_version!()) | (version: crate_version!()) | ||||
@@ -74,15 +45,21 @@ fn main() { | |||||
("init", Some(matches)) => { | ("init", Some(matches)) => { | ||||
match cmd::create_new_project(matches.value_of("name").unwrap()) { | match cmd::create_new_project(matches.value_of("name").unwrap()) { | ||||
Ok(()) => console::success("Project created"), | Ok(()) => console::success("Project created"), | ||||
Err(e) => unravel_errors("Failed to create the project", &e, true), | |||||
Err(e) => { | |||||
console::unravel_errors("Failed to create the project", &e); | |||||
::std::process::exit(1); | |||||
}, | |||||
}; | }; | ||||
}, | }, | ||||
("build", Some(_)) => { | ("build", Some(_)) => { | ||||
console::info("Building site..."); | console::info("Building site..."); | ||||
let start = Instant::now(); | let start = Instant::now(); | ||||
match cmd::build(config_file) { | match cmd::build(config_file) { | ||||
Ok(()) => report_elapsed_time(start), | |||||
Err(e) => unravel_errors("Failed to build the site", &e, true), | |||||
Ok(()) => console::report_elapsed_time(start), | |||||
Err(e) => { | |||||
console::unravel_errors("Failed to build the site", &e); | |||||
::std::process::exit(1); | |||||
}, | |||||
}; | }; | ||||
}, | }, | ||||
("serve", Some(matches)) => { | ("serve", Some(matches)) => { | ||||
@@ -91,7 +68,10 @@ fn main() { | |||||
console::info("Building site..."); | console::info("Building site..."); | ||||
match cmd::serve(interface, port, config_file) { | match cmd::serve(interface, port, config_file) { | ||||
Ok(()) => (), | Ok(()) => (), | ||||
Err(e) => unravel_errors("Failed to build the site", &e, true), | |||||
Err(e) => { | |||||
console::unravel_errors("Failed to build the site", &e); | |||||
::std::process::exit(1); | |||||
}, | |||||
}; | }; | ||||
}, | }, | ||||
_ => unreachable!(), | _ => unreachable!(), | ||||