diff --git a/Cargo.toml b/Cargo.toml index 3cb3dd1..71dfc00 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,12 +5,10 @@ members = [ "members/libpt-core", "members/libpt-bintols", "members/libpt-math", - "members/libpt-bin", "members/libpt-log", "members/libpt-net", - "members/libpt-hedu", ] -default-members = [".", "members/libpt-bin", "members/libpt-core"] +default-members = [".", "members/libpt-core"] [workspace.package] publish = true version = "0.2.5" @@ -36,6 +34,7 @@ libpt-bintols = { version = "0.2.5", ath = "../libpt-bintols" } [package] name = "libpt" +autobins = true publish.workspace = true version.workspace = true edition.workspace = true @@ -50,15 +49,13 @@ categories.workspace = true [features] default = ["log", "core"] -all = ["default", "math", "log", "bintols", "net", "ccc", "hedu", "core"] core = [] -fw = [] -math = [] -log = [] -bintols = [] -net = [] +math = ["dep:libpt-math"] +log = ["dep:libpt-log"] +bintols = ["dep:libpt-bintols"] +net = ["dep:libpt-net"] ccc = ["math"] -hedu = ["bintols"] +bin = ["bintols", "net", "dep:clap", "dep:clap-num", "dep:clap-verbosity-flag"] [lib] name = "libpt" @@ -68,13 +65,21 @@ crate-type = [ "rlib", ] -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html +[[bin]] +name = "ccc" +path = "src/ccc/mod.rs" + +[[bin]] +name = "hedu" +path = "src/hedu/mod.rs" [dependencies] -libpt-bintols = { version = "0.2.5", path = "members/libpt-bintols" } -libpt-core = { version = "0.2.5", path = "members/libpt-core" } -libpt-hedu = { version = "0.2.5", path = "members/libpt-hedu" } -libpt-log = { version = "0.2.5", path = "members/libpt-log" } -libpt-math = { version = "0.2.5", path = "members/libpt-math" } -libpt-ccc = { version = "0.2.5", path = "members/libpt-ccc" } -libpt-net = { version = "0.2.5", path = "members/libpt-net" } +libpt-core = { version = "0.2.0-alpha.2", path = "members/libpt-core", registry = "cscherr" } +libpt-bintols = { version = "0.2.0-alpha.2", optional = true, path = "members/libpt-bintols", registry = "cscherr" } +libpt-log = { version = "0.2.0-alpha.2", optional = true, path = "members/libpt-log", registry = "cscherr" } +libpt-math = { version = "0.2.0-alpha.2", optional = true, path = "members/libpt-math", registry = "cscherr" } +libpt-ccc = { version = "0.2.0-alpha.2", optional = true, path = "members/libpt-ccc", registry = "cscherr" } +libpt-net = { version = "0.2.0-alpha.2", optional = true, path = "members/libpt-net", registry = "cscherr" } +clap = { version = "4.4.4", features = ["derive"], optional = true } +clap-num = { version = "1.0.2", optional = true } +clap-verbosity-flag = { version = "2.0.1", optional = true } diff --git a/members/libpt-bin/src/main/args.rs b/members/libpt-bin/src/main/args.rs deleted file mode 100644 index 43d2266..0000000 --- a/members/libpt-bin/src/main/args.rs +++ /dev/null @@ -1,124 +0,0 @@ -//! # args module -//! -//! The args module of libpt is used to parse commandline arguments. For this, it makes use of -//! [`clap`]. - -//// ATTRIBUTES //////////////////////////////////////////////////////////////////////////////////// -// we want docs -#![warn(missing_docs)] -#![warn(rustdoc::missing_crate_level_docs)] -//////////////////////////////////////////////////////////////////////////////////////////////////// -// we want Debug everywhere. -#![warn(missing_debug_implementations)] -//////////////////////////////////////////////////////////////////////////////////////////////////// -// enable clippy's extra lints, the pedantic version -#![warn(clippy::pedantic)] - -//// IMPORTS /////////////////////////////////////////////////////////////////////////////////////// -use clap::{Parser, Subcommand}; - -use clap_num::number_range; - -use clap_verbosity_flag::{InfoLevel, Verbosity}; - -//// CONSTANTS ///////////////////////////////////////////////////////////////////////////////////// -/// short about section displayed in help -const ABOUT_ROOT: &'static str = r##" -Personal multi tool - - A collection of tools made for personal use -"##; -/// longer about section displayed in help, is combined with [the short help](ABOUT_ROOT) -static LONG_ABOUT_ROOT: &'static str = r##" - - libpt is a personal general purpose library, offering this executable, a python module and a - dynamic library. -"##; - -//// STATICS /////////////////////////////////////////////////////////////////////////////////////// -/// ## Main struct for parsing CLI arguments -/// -/// This struct describes the complete commandline options/arguments that [pt](crate) can take. It -/// makes use of composition to build a complex system of commands, subcommands, flags and options. -#[derive(Debug, Clone, Parser)] -#[command( - author, - version, - about = ABOUT_ROOT, - long_about = format!("{}{}", ABOUT_ROOT ,LONG_ABOUT_ROOT), - help_template = -r#"libpt: {version}{about-section}Author: -{author-with-newline} -{usage-heading} {usage}{all-args}{tab}"# - )] -pub struct Cli { - // clap_verbosity_flag seems to make this a global option implicitly - /// set a verbosity, multiple allowed (f.e. -vvv) - #[command(flatten)] - pub verbose: Verbosity, - - /// show logger meta - #[arg(short, long, global = true)] - pub log_meta: bool, - - /// choose a subcommand - #[command(subcommand)] - pub command: Commands, -} - -//// ENUMS ///////////////////////////////////////////////////////////////////////////////////////// -/// ## defines the top level commands -#[derive(Debug, Clone, Subcommand)] -#[non_exhaustive] -pub enum Commands { - /// networking commands - Net { - /// Networking subcommands - #[command(subcommand)] - command: NetCommands, - }, -} - -//////////////////////////////////////////////////////////////////////////////////////////////////// -/// ## defines the networking commands -#[derive(Debug, Clone, Subcommand)] -#[non_exhaustive] -pub enum NetCommands { - /// monitor your network - Monitor { - /// repeat every N seconds, 0 means no repeat - #[clap(short, long, default_value_t = 0, name = "N")] - repeat: u64, - - /// At what percentage should the try be considered successful - #[clap(short, long, default_value_t = 100, value_parser=max100)] - success_ratio: u8, - - /// extra URLs to check with - extra_urls: Vec, - - /// Don't check for default URLs - #[clap(short, long)] - no_default: bool, - - /// set a timeout (in ms) - #[clap(short, long, default_value_t = 100)] - timeout: u64, - }, - /// discover hosts in your network - Discover {}, -} - -//////////////////////////////////////////////////////////////////////////////////////////////////// - -//// STRUCTS /////////////////////////////////////////////////////////////////////////////////////// - -//// IMPLEMENTATION //////////////////////////////////////////////////////////////////////////////// - -//// PUBLIC FUNCTIONS ////////////////////////////////////////////////////////////////////////////// - -//// PRIVATE FUNCTIONS ///////////////////////////////////////////////////////////////////////////// -/// custom value parser, only allow 0 to 100 -fn max100(s: &str) -> Result { - number_range(s, 0, 100) -} diff --git a/members/libpt-bin/src/main/mod.rs b/members/libpt-bin/src/main/mod.rs deleted file mode 100644 index e7ba1bc..0000000 --- a/members/libpt-bin/src/main/mod.rs +++ /dev/null @@ -1,102 +0,0 @@ -//! # Main executable of libpt -//! -//! This module contains all code specific to the executable version of [`pt`]: [`pt`](crate). -//! -//! - -//// ATTRIBUTES //////////////////////////////////////////////////////////////////////////////////// -// we want docs -#![warn(missing_docs)] -#![warn(rustdoc::missing_crate_level_docs)] -// we want Debug everywhere. -#![warn(missing_debug_implementations)] -// enable clippy's extra lints, the pedantic version -#![warn(clippy::pedantic)] - -//// IMPORTS /////////////////////////////////////////////////////////////////////////////////////// -use libpt::{log::*, net::monitoring::uptime}; - -use clap::Parser; - -pub mod args; -use args::*; - -//// CONSTANTS ///////////////////////////////////////////////////////////////////////////////////// -#[allow(dead_code)] -//// STATICS /////////////////////////////////////////////////////////////////////////////////////// - -//// MACROS //////////////////////////////////////////////////////////////////////////////////////// - -//// ENUMS ///////////////////////////////////////////////////////////////////////////////////////// - -//// STRUCTS /////////////////////////////////////////////////////////////////////////////////////// - -//// IMPLEMENTATION //////////////////////////////////////////////////////////////////////////////// - -//// PUBLIC FUNCTIONS ////////////////////////////////////////////////////////////////////////////// -/// ## Main function of the [`pt`](crate) binary -pub fn main() { - let cli = Cli::parse(); - let ll: Level = match cli.verbose.log_level().unwrap().as_str() { - "TRACE" => Level::TRACE, - "DEBUG" => Level::DEBUG, - "INFO" => Level::INFO, - "WARN" => Level::WARN, - "ERROR" => Level::ERROR, - _ => { - eprintln!("'{}' is not a valid loglevel", cli.verbose.to_string()); - std::process::exit(1); - } - }; - if cli.log_meta { - Logger::init(None, Some(ll)).expect("could not initialize Logger"); - } else { - // less verbose version - Logger::init_mini(Some(ll)).expect("could not initialize Logger"); - } - - trace!("started the main function"); - trace!("{:?}", &cli); - - match cli.clone().command { - Commands::Net { command } => net(&cli, command), - } -} - -//////////////////////////////////////////////////////////////////////////////////////////////////// -/// ## Process [`Net`](args::NetCommands) subcommands -pub fn net(cli: &Cli, command: NetCommands) { - match command { - NetCommands::Monitor { - repeat, - success_ratio, - extra_urls, - no_default, - timeout, - } => { - let urls: Vec; - if no_default { - urls = extra_urls; - } else { - let mut combined: Vec = Vec::new(); - for i in uptime::DEFAULT_CHECK_URLS { - combined.push(i.to_string()); - } - combined.extend(extra_urls); - urls = combined; - } - let _verbose = cli.verbose.log_level().is_some(); - if repeat > 0 { - uptime::continuous_uptime_monitor(success_ratio, urls, repeat * 1000, timeout); - } else { - let status = uptime::UptimeStatus::new(success_ratio, urls, timeout); - info!("status:\n{}", status); - } - } - NetCommands::Discover {} => { - todo!() - } - } -} - -//// PRIVATE FUNCTIONS ///////////////////////////////////////////////////////////////////////////// diff --git a/members/libpt-bintols/Cargo.toml b/members/libpt-bintols/Cargo.toml index 2630dcc..831e5f0 100644 --- a/members/libpt-bintols/Cargo.toml +++ b/members/libpt-bintols/Cargo.toml @@ -16,5 +16,7 @@ categories.workspace = true [dependencies] num-traits = "0.2.16" -libpt-core = { version = "0.2.3", path = "../libpt-core" } -libpt-log = { version = "0.2.3", path = "../libpt-log" } +libpt-core = { version = "0.2.0-alpha.2", path = "../libpt-core", registry = "cscherr" } +libpt-log = { version = "0.2.0-alpha.2", path = "../libpt-log", registry = "cscherr" } +anyhow = { workspace = true } +thiserror = { workspace = true } diff --git a/members/libpt-hedu/src/lib.rs b/members/libpt-bintols/src/hedu/mod.rs similarity index 98% rename from members/libpt-hedu/src/lib.rs rename to members/libpt-bintols/src/hedu/mod.rs index aab45f2..686dba8 100644 --- a/members/libpt-hedu/src/lib.rs +++ b/members/libpt-bintols/src/hedu/mod.rs @@ -6,7 +6,7 @@ //! This crate is currently empty. use anyhow::{bail, Result}; -use libpt_bintols::display::{bytes_to_bin, humanbytes}; +use crate::display::{bytes_to_bin, humanbytes}; use libpt_log::{debug, error, info, trace, warn}; use std::io::{prelude::*, BufReader, Read, SeekFrom}; diff --git a/members/libpt-bintols/src/lib.rs b/members/libpt-bintols/src/lib.rs index ca13f78..f74ea49 100644 --- a/members/libpt-bintols/src/lib.rs +++ b/members/libpt-bintols/src/lib.rs @@ -22,6 +22,6 @@ pub const ZEBI: u128 = 2u128.pow(70); /// 2^80 pub const YOBI: u128 = 2u128.pow(80); -// use libpt_core; pub mod datalayout; pub mod display; +pub mod hedu; diff --git a/members/libpt-bin/src/ccc/mod.rs b/src/ccc/mod.rs similarity index 99% rename from members/libpt-bin/src/ccc/mod.rs rename to src/ccc/mod.rs index c15bf87..a80f702 100644 --- a/members/libpt-bin/src/ccc/mod.rs +++ b/src/ccc/mod.rs @@ -6,6 +6,7 @@ //! expression. //// ATTRIBUTES //////////////////////////////////////////////////////////////////////////////////// +#![cfg(feature = "bin")] // we want docs #![warn(missing_docs)] #![warn(rustdoc::missing_crate_level_docs)] diff --git a/members/libpt-bin/src/hedu/mod.rs b/src/hedu/mod.rs similarity index 97% rename from members/libpt-bin/src/hedu/mod.rs rename to src/hedu/mod.rs index 91fe487..6ac1dd2 100644 --- a/members/libpt-bin/src/hedu/mod.rs +++ b/src/hedu/mod.rs @@ -3,6 +3,7 @@ //! Dump data to a fancy format. //// ATTRIBUTES //////////////////////////////////////////////////////////////////////////////////// +#![cfg(feature = "bin")] // we want docs #![warn(missing_docs)] #![warn(rustdoc::missing_crate_level_docs)] @@ -13,12 +14,12 @@ //// IMPORTS /////////////////////////////////////////////////////////////////////////////////////// -use libpt::{hedu::*, log::*}; +use libpt::{bintols::hedu::*, log::*}; use clap::Parser; use clap_verbosity_flag::{InfoLevel, Verbosity}; -use std::{fs::File, io::IsTerminal}; +use std::{fs::File, io::IsTerminal, eprintln}; //// TYPES ///////////////////////////////////////////////////////////////////////////////////////// diff --git a/src/lib.rs b/src/lib.rs index 1390701..8899a30 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -12,8 +12,6 @@ pub use libpt_bintols as bintols; pub use libpt_ccc as ccc; #[cfg(feature = "core")] pub use libpt_core as core; -#[cfg(feature = "hedu")] -pub use libpt_hedu as hedu; #[cfg(feature = "log")] pub use libpt_log as log; #[cfg(feature = "math")]