1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
#![deny( anonymous_parameters, bare_trait_objects, clippy::all, clippy::complexity, clippy::correctness, clippy::nursery, clippy::pedantic, clippy::perf, clippy::style, elided_lifetimes_in_paths, missing_copy_implementations, missing_debug_implementations, single_use_lifetimes, trivial_casts, trivial_numeric_casts, unreachable_pub, unsafe_code, unused_import_braces, unused_qualifications, variant_size_differences )] #![allow( clippy::filter_map, clippy::missing_errors_doc, clippy::non_ascii_literal, clippy::redundant_pub_crate, clippy::unused_self, clippy::wildcard_imports )] #![cfg_attr(all(test, feature = "mocking"), allow(trivial_casts, unsafe_code))] #![cfg_attr(all(test, feature = "mocking"), feature(proc_macro_hygiene))] #[macro_use] mod macros; mod communication; mod error; mod feature; mod features; mod resume; mod settings; mod status_bar; #[cfg(test)] mod test_utils; mod utils; mod wrapper; use crate::error::*; use crate::status_bar::StatusBar; use crate::wrapper::channel; use crate::wrapper::termination; use std::collections::HashSet; use std::iter::FromIterator; fn validate_settings(settings: &settings::Settings) -> Result<()> { if settings.general.order.is_empty() { return Err(Error::new_custom("settings", "no features enabled")); } let set: HashSet<&String> = HashSet::from_iter(settings.general.order.iter()); if set.len() < settings.general.order.len() { return Err(Error::new_custom( "settings", "order must not have more than one entry of one feature", )); } Ok(()) } pub fn run(config_path: &str) -> Result<()> { let settings = settings::Settings::init(config_path)?; validate_settings(&settings)?; let (sender, receiver) = channel::create(); let mut features = Vec::new(); for (index, feature_name) in settings.general.order.iter().enumerate() { let mut feature = features::create_feature(index, feature_name, &sender, &settings)?; feature.init_notifier()?; features.push(feature); } resume::init_resume_notifier(&sender)?; sender.send(communication::Message::UpdateAll)?; termination::register_handler(move || { sender .send(communication::Message::Kill) .show_error() .unwrap() })?; let mut status_bar = StatusBar::init(features)?; while let Ok(message) = receiver.read_blocking() { match message { communication::Message::Kill => break, _ => status_bar.update(&message, &settings.general)?, } } Ok(()) }