diff options
author | metamuffin <yvchraiqi@protonmail.com> | 2022-06-10 17:48:32 +0200 |
---|---|---|
committer | metamuffin <yvchraiqi@protonmail.com> | 2022-06-10 17:48:32 +0200 |
commit | 45f2d1651f17d7e155748cfd1e1cd9a96f3e530e (patch) | |
tree | 6847a4552db06b56a5e0a55aa56354eccb7c41b1 /karlc | |
parent | d65b915f3dfda28aad6f2806df38c8ad77135d8b (diff) | |
download | karlender-45f2d1651f17d7e155748cfd1e1cd9a96f3e530e.tar karlender-45f2d1651f17d7e155748cfd1e1cd9a96f3e530e.tar.bz2 karlender-45f2d1651f17d7e155748cfd1e1cd9a96f3e530e.tar.zst |
better cli
Diffstat (limited to 'karlc')
-rw-r--r-- | karlc/Cargo.toml | 2 | ||||
-rw-r--r-- | karlc/src/client.rs | 20 | ||||
-rw-r--r-- | karlc/src/main.rs | 77 |
3 files changed, 83 insertions, 16 deletions
diff --git a/karlc/Cargo.toml b/karlc/Cargo.toml index f95dee0..653933a 100644 --- a/karlc/Cargo.toml +++ b/karlc/Cargo.toml @@ -13,3 +13,5 @@ env_logger = "0.9.0" log = "0.4.17" crossbeam-channel = "0.5.4" chrono = { version = "0.4.19", features = ["serde"] } +rand = "0.8.5" + diff --git a/karlc/src/client.rs b/karlc/src/client.rs index 6420da0..e7ca44d 100644 --- a/karlc/src/client.rs +++ b/karlc/src/client.rs @@ -5,8 +5,8 @@ use std::{ }; use crossbeam_channel::Receiver; -use karlcommon::{ClientboundPacket, ServerboundPacket}; -use log::debug; +use karlcommon::{version, ClientboundPacket, ServerboundPacket}; +use log::{debug, error}; pub struct Client { socket: UnixStream, @@ -17,18 +17,20 @@ impl Client { pub fn new(socket: UnixStream) -> Self { let (sender, receiver) = crossbeam_channel::unbounded(); let mut reader = BufReader::new(socket.try_clone().unwrap()); - thread::spawn(move || { - loop { - let mut buf = String::new(); - reader.read_line(&mut buf).unwrap(); - let p: ClientboundPacket = serde_json::from_str(buf.as_str()).unwrap(); - debug!("<- {:?}", p); + thread::spawn(move || loop { + let mut buf = String::new(); + reader.read_line(&mut buf).unwrap(); + let p: ClientboundPacket = serde_json::from_str(buf.as_str()).unwrap(); + debug!("<- {:?}", p); + if let ClientboundPacket::Error(e) = p { + error!("daemon reported error: {:?}", e); + } else { sender.send(p).unwrap(); } }); let mut c = Self { receiver, socket }; c.send(ServerboundPacket::Handshake { - version: env!("CARGO_PKG_VERSION").to_owned(), + version: version!(), }); return c; } diff --git a/karlc/src/main.rs b/karlc/src/main.rs index 9a89de9..ef56fd9 100644 --- a/karlc/src/main.rs +++ b/karlc/src/main.rs @@ -1,16 +1,19 @@ pub mod client; use chrono::{NaiveDateTime, Utc}; -use clap::{Parser, Subcommand}; +use clap::{Args, Parser, Subcommand}; use client::Client; -use karlcommon::{socket_path, version, ClientboundPacket, ServerboundPacket}; +use karlcommon::{socket_path, version, ClientboundPacket, ServerboundPacket, Task}; use log::{error, info}; -use std::{os::unix::net::UnixStream, process::exit}; +use std::{os::unix::net::UnixStream, path::PathBuf, process::exit}; /// CLI interface for karld #[derive(Parser)] #[clap(about, author, version)] -struct Args { +struct Arguments { + /// Custom path to the daemon socket + #[clap(long)] + socket_path: Option<PathBuf>, #[clap(subcommand)] action: Action, } @@ -21,13 +24,36 @@ pub enum Action { Version, /// List all tasks List, + /// Remove a task by id + Remove { id: u64 }, + /// Update a task by id + Update { + id: u64, + #[clap(flatten)] + task: TaskSpec, + }, + /// Create a task + Create { + #[clap(flatten)] + task: TaskSpec, + }, +} + +#[derive(Args)] +pub struct TaskSpec { + #[clap(short, long)] + name: String, + #[clap(short, long)] + description: Option<String>, + #[clap(short, long)] + tags: Vec<String>, } fn main() { env_logger::init(); - let args = Args::parse(); + let args = Arguments::parse(); - let socket = match UnixStream::connect(socket_path()) { + let socket = match UnixStream::connect(args.socket_path.unwrap_or(socket_path())) { Ok(s) => s, Err(e) => { error!("failed to connect to socket: {}", e); @@ -62,7 +88,11 @@ fn main() { \x1b[38;2;100;255;100mDescription:\x1b[0m {} \x1b[38;2;100;255;100mOccurence:\x1b[0m {:?} \x1b[38;2;100;255;100mNext instances: \x1b[0m", - t.id, t.name, t.description, t.occurence + t.id, + t.name, + t.description + .unwrap_or("\x1b[3m\x1b[2m(no description)\x1b[0m".to_string()), + t.occurence ); client.send(ServerboundPacket::ListInstances { task: t.id, @@ -94,5 +124,38 @@ fn main() { } } } + Action::Remove { id } => { + client.send(ServerboundPacket::RemoveTask(id)); + } + Action::Update { id, task } => { + let mut t = task.build(); + t.id = id; + client.send(ServerboundPacket::UpdateTask(t)) + } + Action::Create { task } => client.send(ServerboundPacket::UpdateTask(task.build())), + } + + // sync + client.send(ServerboundPacket::Sync); + for p in client.receiver.iter() { + if let ClientboundPacket::Sync = p { + break; + } + } +} + +impl TaskSpec { + pub fn build(self) -> Task { + Task { + id: rand::random(), + name: self.name, + description: self.description, + tags: self.tags, + priority: 0.0, + completed: None, + scheduled: None, + occurence: None, + deadline: None, + } } } |