use std::time::Duration;
use ratatui::backend::Backend;
use super::Runtime;
use super::config::RuntimeConfig;
use crate::app::model::App;
use crate::error;
pub struct ConfiguredRuntimeBuilder<A: App, B: Backend> {
pub(super) backend: B,
pub(super) config: Option<RuntimeConfig>,
pub(super) args: A::Args,
}
impl<A: App, B: Backend> ConfiguredRuntimeBuilder<A, B> {
pub fn config(mut self, config: RuntimeConfig) -> Self {
self.config = Some(config);
self
}
pub fn tick_rate(mut self, rate: Duration) -> Self {
self.config_mut().tick_rate = rate;
self
}
pub fn frame_rate(mut self, rate: Duration) -> Self {
self.config_mut().frame_rate = rate;
self
}
pub fn max_messages(mut self, max: usize) -> Self {
self.config_mut().max_messages_per_tick = max;
self
}
pub fn channel_capacity(mut self, capacity: usize) -> Self {
self.config_mut().message_channel_capacity = capacity;
self
}
fn config_mut(&mut self) -> &mut RuntimeConfig {
self.config.get_or_insert_with(RuntimeConfig::default)
}
pub fn build(self) -> error::Result<Runtime<A, B>> {
let (state, init_cmd) = A::init(self.args);
let config = self.config.unwrap_or_default();
Runtime::with_backend_state_and_config(self.backend, state, init_cmd, config)
}
}