aboutsummaryrefslogtreecommitdiffstats
path: root/src/client/listener.rs
blob: 2e223f6ceb354dabe44a2d1180613ece29eac2b0 (plain)
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
/* Polydoro - Pomodoro widget for polybar and friends
 * Copyright (C) 2025  Vidhu Kant Sharma <vidhukant@vidhukant.com>
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */

use std::os::unix::net::UnixStream;
use std::io::{BufReader};

use bincode::{decode_from_std_read, config};
use crate::daemon::pomo::{Pomo,State};

pub fn start_listener() {
    let sock_path = "/tmp/polydorod.sock";
    let stream = UnixStream::connect(sock_path).unwrap_or_else(|_| panic!("could not connect to daemon"));
    let mut reader = BufReader::new(stream);

    loop {
        // blocks until a struct is received
        match decode_from_std_read::<Pomo, _, _>(&mut reader, config::standard()) {
            Ok(p) => {
                pretty_print(p);
            }
            Err(e) => {
                eprintln!("polydoro listener error: {}", e);
                std::process::exit(1);
            }
        }
    }
}

pub fn format_time(secs: u64) -> String {
    format!("{:02}:{:02}", secs / 60, secs % 60)
}

pub fn pretty_print(p: Pomo) {
    let format_work = "work";
    let format_work_paused = "[work]";
    let format_work_idle = "(work)";
    let format_break = "break";
    let format_break_paused = "[break]";
    let format_break_idle = "(break)";
    let format_long_break = "long break";
    let format_long_break_paused = "[long break]";
    let format_long_break_idle = "(long break)";

    let f = match p.current_state {
        State::Work => format_work,
        State::Break => format_break,
        State::LongBreak => format_long_break,

        State::WorkPaused => format_work_paused,
        State::BreakPaused => format_break_paused,
        State::LongBreakPaused => format_long_break_paused,

        State::WorkIdle => format_work_idle,
        State::BreakIdle => format_break_idle,
        State::LongBreakIdle => format_long_break_idle,
    };

    println!("{} {} - {}", f, p.counter, format_time(p.secs_elapsed));
}