use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BehaviorExecutorConfig {
pub behavior_name: String,
#[serde(default = "default_behaviors_dir")]
pub behaviors_dir: String,
#[serde(default = "default_tick_rate_hz")]
pub tick_rate_hz: f32,
#[serde(default)]
pub max_ticks: Option<usize>,
#[serde(default = "default_log_stats")]
pub log_stats: bool,
#[serde(default)]
pub topics: Topics,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Topics {
#[serde(default)]
pub publishes: Vec<HashMap<String, String>>,
#[serde(default)]
pub subscribes: Vec<HashMap<String, String>>,
}
impl Default for Topics {
fn default() -> Self {
let mut publishes = Vec::new();
let mut subscribes = Vec::new();
let mut status_map = HashMap::new();
status_map.insert("status".to_string(), "/behavior/status".to_string());
publishes.push(status_map);
let mut control_map = HashMap::new();
control_map.insert("control".to_string(), "/behavior/control".to_string());
subscribes.push(control_map);
Self { publishes, subscribes }
}
}
impl BehaviorExecutorConfig {
pub fn control_topic(&self) -> String {
self.topics
.subscribes
.iter()
.find_map(|t| t.get("control"))
.cloned()
.unwrap_or_else(|| "/behavior/control".to_string())
}
pub fn status_topic(&self) -> String {
self.topics
.publishes
.iter()
.find_map(|t| t.get("status"))
.cloned()
.unwrap_or_else(|| "/behavior/status".to_string())
}
}
impl Default for BehaviorExecutorConfig {
fn default() -> Self {
Self {
behavior_name: "idle_wander".to_string(),
behaviors_dir: default_behaviors_dir(),
tick_rate_hz: default_tick_rate_hz(),
max_ticks: None,
log_stats: default_log_stats(),
topics: Topics::default(),
}
}
}
fn default_behaviors_dir() -> String {
"behaviors".to_string()
}
fn default_tick_rate_hz() -> f32 {
10.0
}
fn default_log_stats() -> bool {
true
}