Expand description
§⏳ time-lib
Rust library to manange time.
The core concept is the [Timer
], which contains information
about the cycle and the state. The [Server
] runs the timer and
accepts connection from [Client
]s using [ServerBind
]ers. The
clients communicate with the server using [Request
]s and
[Response
]s, which allow them to control the timer. The timer
can be customized using [TimerConfig
] and [TimerCycle
].
┌────────────────────────┐
│Server │
│ ┌────────┐ │ Request ┌────────┐
│ │ │◄├─────────┤ │
│ ┌────────┤Binder A│ │ │Client A│
│ │ │ ├─┼────────►│ │
│ │ └────────┘ │Response └────────┘
│ │ │
│ ▼ ┌────────┐ │ ┌────────┐
│ ┌─────┐ │ │◄├─────────┤ │
│ │Timer│◄────┤Binder B│ │ │Client B│
│ └─────┘ │ ├─┼────────►│ │
│ ▲ └────────┘ │ └────────┘
│ │ │
│ │ ┌────────┐ │ ┌────────┐
│ │ │ │◄├─────────┤ │
│ └────────┤Binder C│ │ │Client C│
│ │ ├─┼────────►│ │
│ └────────┘ │ └────────┘
│ │
└────────────────────────┘
Example using TCP and the Pomodoro technique:
$ cargo run --example pomodoro-tcp
ⓘ
use std::time::Duration;
use time::{
client::tcp::TcpClient,
server::{tcp::TcpBind, ServerBuilder, ServerEvent},
timer::TimerEvent,
};
static HOST: &str = "127.0.0.1";
static PORT: u16 = 3000;
#[tokio::main]
async fn main() {
let server = ServerBuilder::new()
.with_server_handler(|event: ServerEvent| async move {
println!("server event: {event:?}");
Ok(())
})
.with_timer_handler(|event: TimerEvent| async move {
println!("timer event: {event:?}");
Ok(())
})
.with_binder(TcpBind::new(HOST, PORT))
.with_pomodoro_config()
.build()
.unwrap();
server
.bind_with(|| async {
// wait for the binder to be ready
tokio::time::sleep(Duration::from_secs(1)).await;
let client = TcpClient::new(HOST, PORT);
client.start().await.unwrap();
tokio::time::sleep(Duration::from_secs(1)).await;
client.pause().await.unwrap();
tokio::time::sleep(Duration::from_secs(1)).await;
let timer = client.get().await.unwrap();
println!("current timer: {timer:?}");
Ok(())
})
.await
.unwrap();
}
See more examples.