From e46047ba4605a6ba7821c4bccf84000aa1dbef17 Mon Sep 17 00:00:00 2001 From: Bauke Date: Wed, 1 Nov 2023 17:56:32 +0100 Subject: [PATCH] Add the log subcommand. --- Cargo.lock | 185 ++++++++++++++++++++++++++++++++++++++++++ Cargo.toml | 3 + source/cli/mod.rs | 24 +++++- source/cli/run.rs | 21 ++++- source/logging/mod.rs | 14 ++++ source/main.rs | 1 + 6 files changed, 243 insertions(+), 5 deletions(-) create mode 100644 source/logging/mod.rs diff --git a/Cargo.lock b/Cargo.lock index cba7139..676fe12 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,6 +2,21 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + [[package]] name = "anstream" version = "0.6.4" @@ -50,13 +65,55 @@ dependencies = [ "windows-sys", ] +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + [[package]] name = "bautils" version = "0.1.0" dependencies = [ + "chrono", "clap", ] +[[package]] +name = "bumpalo" +version = "3.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" + +[[package]] +name = "cc" +version = "1.0.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" +dependencies = [ + "libc", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "chrono" +version = "0.4.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f2c685bad3eb3d45a01354cedb7d5faa66194d1d58ba6e267a8de788f79db38" +dependencies = [ + "android-tzdata", + "iana-time-zone", + "js-sys", + "num-traits", + "wasm-bindgen", + "windows-targets", +] + [[package]] name = "clap" version = "4.4.7" @@ -103,12 +160,77 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" +[[package]] +name = "core-foundation-sys" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" + [[package]] name = "heck" version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" +[[package]] +name = "iana-time-zone" +version = "0.1.58" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8326b86b6cff230b97d0d312a6c40a60726df3332e721f72a1b035f451663b20" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "js-sys" +version = "0.3.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "libc" +version = "0.2.149" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a08173bc88b7955d1b3145aa561539096c421ac8debde8cbc3612ec635fee29b" + +[[package]] +name = "log" +version = "0.4.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" + +[[package]] +name = "num-traits" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" +dependencies = [ + "autocfg", +] + +[[package]] +name = "once_cell" +version = "1.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" + [[package]] name = "proc-macro2" version = "1.0.69" @@ -156,6 +278,69 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" +[[package]] +name = "wasm-bindgen" +version = "0.2.87" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.87" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.87" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.87" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.87" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1" + +[[package]] +name = "windows-core" +version = "0.51.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1f8cf84f35d2db49a46868f947758c7a1138116f7fac3bc844f43ade1292e64" +dependencies = [ + "windows-targets", +] + [[package]] name = "windows-sys" version = "0.48.0" diff --git a/Cargo.toml b/Cargo.toml index 7743c0a..f1bd595 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,6 +13,9 @@ edition = "2021" name = "bautils" path = "source/main.rs" +[dependencies] +chrono = "0.4.30" + [dependencies.clap] features = ["derive"] version = "4.4.7" diff --git a/source/cli/mod.rs b/source/cli/mod.rs index a719797..b2ca918 100644 --- a/source/cli/mod.rs +++ b/source/cli/mod.rs @@ -1,10 +1,28 @@ //! The CLI definitions. -pub use {crate::cli::run::run, clap::Parser}; +pub use { + crate::cli::run::run, + clap::{Parser, Subcommand}, +}; mod run; /// The main CLI command. #[derive(Debug, Parser)] -#[command(about, author, version)] -pub struct Cli {} +#[command(about, author, version, propagate_version = true)] +pub struct Cli { + /// The main CLI subcommand. + #[command(subcommand)] + pub command: MainSubcommand, +} + +/// The main subcommands. +#[derive(Debug, Subcommand)] +pub enum MainSubcommand { + /// The log subcommand. + Log { + /// The data to log. + #[arg(last = true)] + data_to_log: Vec, + }, +} diff --git a/source/cli/run.rs b/source/cli/run.rs index b92a41d..e388a44 100644 --- a/source/cli/run.rs +++ b/source/cli/run.rs @@ -1,9 +1,26 @@ //! The CLI logic. -use super::{Cli, Parser}; +use { + crate::{ + cli::{Cli, MainSubcommand::*, Parser}, + logging::append_line_to_file, + }, + chrono::{SecondsFormat, Utc}, +}; /// Parse the CLI arguments and execute them. pub fn run() { let cli = Cli::parse(); - dbg!(cli); + + match cli.command { + Log { data_to_log } => { + let log_line = format!( + "{} {}", + Utc::now().to_rfc3339_opts(SecondsFormat::Millis, true), + data_to_log.join(" ") + ); + println!("{}", log_line); + append_line_to_file("log.txt", &log_line).unwrap(); + } + } } diff --git a/source/logging/mod.rs b/source/logging/mod.rs new file mode 100644 index 0000000..09af7e0 --- /dev/null +++ b/source/logging/mod.rs @@ -0,0 +1,14 @@ +//! All logic for logging things. + +use std::{fs::OpenOptions, io::prelude::*}; + +/// Append the `log_line` to a given file at `path` and creates the file if it +/// doesn't exist. +pub fn append_line_to_file( + path: &str, + log_line: &str, +) -> Result<(), std::io::Error> { + let mut log_file = OpenOptions::new().create(true).append(true).open(path)?; + writeln!(log_file, "{}", log_line)?; + Ok(()) +} diff --git a/source/main.rs b/source/main.rs index 5956483..6bee81e 100644 --- a/source/main.rs +++ b/source/main.rs @@ -6,6 +6,7 @@ #![warn(missing_docs, clippy::missing_docs_in_private_items)] mod cli; +mod logging; fn main() { cli::run();