slim down lib.rs
This commit is contained in:
parent
e3ed6d8517
commit
77afb51582
2 changed files with 78 additions and 73 deletions
|
@ -1,5 +1,11 @@
|
||||||
use std::path::{Path, PathBuf};
|
use std::path::{Path, PathBuf};
|
||||||
|
|
||||||
|
use failure::{err_msg, Error};
|
||||||
|
use walkdir::WalkDir;
|
||||||
|
|
||||||
|
use Hook;
|
||||||
|
use {HOOKS, PROGRAMS};
|
||||||
|
|
||||||
#[derive(Debug, StructOpt)]
|
#[derive(Debug, StructOpt)]
|
||||||
pub struct Config {
|
pub struct Config {
|
||||||
/// The root configuration directory for dip. This argument is required.
|
/// The root configuration directory for dip. This argument is required.
|
||||||
|
@ -34,3 +40,72 @@ impl Config {
|
||||||
return self;
|
return self;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn load_config<P>(root: P)
|
||||||
|
where
|
||||||
|
P: AsRef<Path>,
|
||||||
|
{
|
||||||
|
println!("Reloading config...");
|
||||||
|
// hold on to the lock while config is being reloaded
|
||||||
|
{
|
||||||
|
let mut programs = PROGRAMS.lock().unwrap();
|
||||||
|
// TODO: some kind of smart diff
|
||||||
|
programs.clear();
|
||||||
|
let programs_dir = {
|
||||||
|
let mut p = root.as_ref().to_path_buf();
|
||||||
|
p.push("handlers");
|
||||||
|
p
|
||||||
|
};
|
||||||
|
if programs_dir.exists() {
|
||||||
|
for entry in WalkDir::new(programs_dir) {
|
||||||
|
let path = match entry.as_ref().map(|e| e.path()) {
|
||||||
|
Ok(path) => path,
|
||||||
|
_ => continue,
|
||||||
|
};
|
||||||
|
if !path.is_file() {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
match path.file_name()
|
||||||
|
.and_then(|s| s.to_str())
|
||||||
|
.ok_or(err_msg("???"))
|
||||||
|
.map(|s| {
|
||||||
|
let filename = s.to_owned();
|
||||||
|
programs.insert(filename, path.to_path_buf())
|
||||||
|
}) {
|
||||||
|
_ => (), // don't care
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
{
|
||||||
|
let mut hooks = HOOKS.lock().unwrap();
|
||||||
|
hooks.clear();
|
||||||
|
let hooks_dir = {
|
||||||
|
let mut p = root.as_ref().to_path_buf();
|
||||||
|
p.push("hooks");
|
||||||
|
p
|
||||||
|
};
|
||||||
|
if hooks_dir.exists() {
|
||||||
|
for entry in WalkDir::new(hooks_dir) {
|
||||||
|
let path = match entry.as_ref().map(|e| e.path()) {
|
||||||
|
Ok(path) => path,
|
||||||
|
_ => continue,
|
||||||
|
};
|
||||||
|
if !path.is_file() {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
match (|path: &Path| -> Result<(), Error> {
|
||||||
|
let hook = Hook::from_file(path)?;
|
||||||
|
let name = hook.get_name();
|
||||||
|
hooks.insert(name, hook);
|
||||||
|
Ok(())
|
||||||
|
})(path)
|
||||||
|
{
|
||||||
|
Ok(_) => (),
|
||||||
|
Err(err) => eprintln!("Failed to read config from {:?}: {}", path, err),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
println!("Done loading config.");
|
||||||
|
}
|
||||||
|
|
76
src/lib.rs
76
src/lib.rs
|
@ -29,13 +29,12 @@ use std::sync::{mpsc, Mutex};
|
||||||
use std::thread;
|
use std::thread;
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
|
|
||||||
use failure::{err_msg, Error};
|
use failure::Error;
|
||||||
use hyper::rt::Future;
|
use hyper::rt::Future;
|
||||||
use hyper::service::service_fn;
|
use hyper::service::service_fn;
|
||||||
use hyper::Server;
|
use hyper::Server;
|
||||||
use notify::{RecommendedWatcher, RecursiveMode, Watcher};
|
use notify::{RecommendedWatcher, RecursiveMode, Watcher};
|
||||||
use regex::Regex;
|
use regex::Regex;
|
||||||
use walkdir::WalkDir;
|
|
||||||
|
|
||||||
pub use config::Config;
|
pub use config::Config;
|
||||||
pub use handler::*;
|
pub use handler::*;
|
||||||
|
@ -53,75 +52,6 @@ lazy_static! {
|
||||||
|
|
||||||
const NOTFOUND: &str = "<html> <head> <style> * { font-family: sans-serif; } body { padding: 20px 60px; } </style> </head> <body> <h1>Looks like you took a wrong turn!</h1> <p>There's nothing to see here.</p> </body> </html>";
|
const NOTFOUND: &str = "<html> <head> <style> * { font-family: sans-serif; } body { padding: 20px 60px; } </style> </head> <body> <h1>Looks like you took a wrong turn!</h1> <p>There's nothing to see here.</p> </body> </html>";
|
||||||
|
|
||||||
fn load_config<P>(root: P)
|
|
||||||
where
|
|
||||||
P: AsRef<Path>,
|
|
||||||
{
|
|
||||||
println!("Reloading config...");
|
|
||||||
// hold on to the lock while config is being reloaded
|
|
||||||
{
|
|
||||||
let mut programs = PROGRAMS.lock().unwrap();
|
|
||||||
// TODO: some kind of smart diff
|
|
||||||
programs.clear();
|
|
||||||
let programs_dir = {
|
|
||||||
let mut p = root.as_ref().to_path_buf();
|
|
||||||
p.push("handlers");
|
|
||||||
p
|
|
||||||
};
|
|
||||||
if programs_dir.exists() {
|
|
||||||
for entry in WalkDir::new(programs_dir) {
|
|
||||||
let path = match entry.as_ref().map(|e| e.path()) {
|
|
||||||
Ok(path) => path,
|
|
||||||
_ => continue,
|
|
||||||
};
|
|
||||||
if !path.is_file() {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
match path.file_name()
|
|
||||||
.and_then(|s| s.to_str())
|
|
||||||
.ok_or(err_msg("???"))
|
|
||||||
.map(|s| {
|
|
||||||
let filename = s.to_owned();
|
|
||||||
programs.insert(filename, path.to_path_buf())
|
|
||||||
}) {
|
|
||||||
_ => (), // don't care
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
{
|
|
||||||
let mut hooks = HOOKS.lock().unwrap();
|
|
||||||
hooks.clear();
|
|
||||||
let hooks_dir = {
|
|
||||||
let mut p = root.as_ref().to_path_buf();
|
|
||||||
p.push("hooks");
|
|
||||||
p
|
|
||||||
};
|
|
||||||
if hooks_dir.exists() {
|
|
||||||
for entry in WalkDir::new(hooks_dir) {
|
|
||||||
let path = match entry.as_ref().map(|e| e.path()) {
|
|
||||||
Ok(path) => path,
|
|
||||||
_ => continue,
|
|
||||||
};
|
|
||||||
if !path.is_file() {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
match (|path: &Path| -> Result<(), Error> {
|
|
||||||
let hook = Hook::from_file(path)?;
|
|
||||||
let name = hook.get_name();
|
|
||||||
hooks.insert(name, hook);
|
|
||||||
Ok(())
|
|
||||||
})(path)
|
|
||||||
{
|
|
||||||
Ok(_) => (),
|
|
||||||
Err(err) => eprintln!("Failed to read config from {:?}: {}", path, err),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
println!("Done loading config.");
|
|
||||||
}
|
|
||||||
|
|
||||||
fn watch<P>(root: P) -> notify::Result<()>
|
fn watch<P>(root: P) -> notify::Result<()>
|
||||||
where
|
where
|
||||||
P: AsRef<Path>,
|
P: AsRef<Path>,
|
||||||
|
@ -135,7 +65,7 @@ where
|
||||||
Ok(_) => {
|
Ok(_) => {
|
||||||
// for now, naively reload entire config every time
|
// for now, naively reload entire config every time
|
||||||
// TODO: don't do this
|
// TODO: don't do this
|
||||||
load_config(root.as_ref())
|
config::load_config(root.as_ref())
|
||||||
}
|
}
|
||||||
Err(e) => println!("watch error: {:?}", e),
|
Err(e) => println!("watch error: {:?}", e),
|
||||||
}
|
}
|
||||||
|
@ -144,7 +74,7 @@ where
|
||||||
|
|
||||||
/// Main entry point of the entire application.
|
/// Main entry point of the entire application.
|
||||||
pub fn run(config: &Config) -> Result<(), Error> {
|
pub fn run(config: &Config) -> Result<(), Error> {
|
||||||
load_config(&config.root);
|
config::load_config(&config.root);
|
||||||
|
|
||||||
let v = config.root.clone();
|
let v = config.root.clone();
|
||||||
thread::spawn(|| watch(v));
|
thread::spawn(|| watch(v));
|
||||||
|
|
Loading…
Reference in a new issue