From c5d61b555a2b9cc028616051da25bcdb4abe4305 Mon Sep 17 00:00:00 2001 From: James Sully Date: Wed, 7 Aug 2024 17:06:03 +1000 Subject: [PATCH] finish implementing list --- dev_daemon.py | 2 ++ src/client.rs | 5 ++--- src/daemon/handle_client.rs | 2 +- src/daemon/state.rs | 4 ++-- src/sand/timer.rs | 25 +++++++++++++++++++++---- src/sand/timers.rs | 9 ++++++--- test.py | 3 +++ 7 files changed, 37 insertions(+), 13 deletions(-) mode change 100644 => 100755 dev_daemon.py diff --git a/dev_daemon.py b/dev_daemon.py old mode 100644 new mode 100755 index b43ca02..2aa5a8d --- a/dev_daemon.py +++ b/dev_daemon.py @@ -1,3 +1,5 @@ +#!/usr/bin/env python3 + import socket import sys import os diff --git a/src/client.rs b/src/client.rs index f962125..9737e6e 100644 --- a/src/client.rs +++ b/src/client.rs @@ -1,7 +1,6 @@ -use std::io::{self, BufRead, BufReader, BufWriter, LineWriter, Write}; -use std::net::TcpStream; -use std::path::{Path, PathBuf}; +use std::io::{self, BufRead, BufReader, LineWriter, Write}; +use std::path::PathBuf; use std::os::unix::net::UnixStream; use dirs; diff --git a/src/daemon/handle_client.rs b/src/daemon/handle_client.rs index d92069d..3d17ac7 100644 --- a/src/daemon/handle_client.rs +++ b/src/daemon/handle_client.rs @@ -30,7 +30,7 @@ impl CmdHandlerCtx { } fn list(&self) -> ListResponse { - ListResponse::ok(self.state.get_timerinfo_for_client()) + ListResponse::ok(self.state.get_timerinfo_for_client(self.now)) } diff --git a/src/daemon/state.rs b/src/daemon/state.rs index 4c3e9ea..61044da 100644 --- a/src/daemon/state.rs +++ b/src/daemon/state.rs @@ -35,8 +35,8 @@ impl DaemonCtx { id } - pub fn get_timerinfo_for_client(&self) -> Vec { - self.timers.get_timerinfo_for_client() + pub fn get_timerinfo_for_client(&self, now: Instant) -> Vec { + self.timers.get_timerinfo_for_client(now) } pub fn add_timer(&self, now: Instant, duration: Duration) -> TimerId { diff --git a/src/sand/timer.rs b/src/sand/timer.rs index a98d635..645c8b5 100644 --- a/src/sand/timer.rs +++ b/src/sand/timer.rs @@ -32,10 +32,27 @@ pub enum Timer { } #[derive(Debug, PartialEq, Serialize, Deserialize)] -pub struct TimerInfoForClient; +pub enum TimerStateForClient { + Paused, + Running, +} + +#[derive(Debug, PartialEq, Serialize, Deserialize)] +pub struct TimerInfoForClient { + id: TimerId, + state: TimerStateForClient, + remaining_millis: u64, +} -impl TimerInfoForClient { - pub fn new(_id: TimerId, _timer: &Timer) -> Self { - Self +impl TimerInfoForClient { + + pub fn new(id: TimerId, timer: &Timer, now: Instant) -> Self { + let (state, remaining_millis) = match timer { + Timer::Paused { remaining } => + (TimerStateForClient::Paused, remaining.as_millis() as u64), + Timer::Running { due, .. } => + (TimerStateForClient::Running, (*due - now).as_millis() as u64), + }; + Self { id, state, remaining_millis } } } \ No newline at end of file diff --git a/src/sand/timers.rs b/src/sand/timers.rs index 9d1a358..1130633 100644 --- a/src/sand/timers.rs +++ b/src/sand/timers.rs @@ -1,4 +1,6 @@ +use std::time::Instant; + use dashmap::{DashMap, Entry}; use crate::sand::timer::*; @@ -13,9 +15,10 @@ impl Timers{ } } - pub fn get_timerinfo_for_client(&self) -> Vec { - self.0.iter().map(|rm| { - TimerInfoForClient::new(*rm.key(), rm.value()) + pub fn get_timerinfo_for_client(&self, now: Instant) -> Vec { + self.0.iter().map(|ref_multi| { + let (id, timer) = ref_multi.pair(); + TimerInfoForClient::new(*id, timer, now) }).collect() } diff --git a/test.py b/test.py index 7ac869a..9fbc81a 100755 --- a/test.py +++ b/test.py @@ -61,6 +61,9 @@ def daemon_socket(): log(f"Removing socket file {SOCKET_PATH}") ensure_deleted(SOCKET_PATH) +# TODO refactor daemon tests to use fake client, client tests to use fake daemon +# they should be testable independently + @pytest.fixture def daemon(daemon_socket):