#[derive(Debug, Clone, PartialEq, Eq)]
pub struct AppActivateRequest {
pub title: String,
pub wait: bool,
}
impl AppActivateRequest {
pub fn new(title: impl Into<String>) -> Self {
Self {
title: title.into(),
wait: false,
}
}
pub fn with_wait(mut self, wait: bool) -> Self {
self.wait = wait;
self
}
pub fn as_task_id(&self) -> Option<i64> {
self.title.trim().parse::<i64>().ok()
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct AppActivateRecord {
pub title: String,
pub wait: bool,
}
impl AppActivateRecord {
pub fn of(request: &AppActivateRequest) -> Self {
Self {
title: request.title.clone(),
wait: request.wait,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn new_starts_minimal() {
let request = AppActivateRequest::new("Calculator");
assert_eq!(request.title, "Calculator");
assert!(!request.wait);
}
#[test]
fn builders_chain() {
let request = AppActivateRequest::new("Notepad").with_wait(true);
assert_eq!(request.title, "Notepad");
assert!(request.wait);
}
#[test]
fn numeric_titles_parse_as_task_ids() {
assert_eq!(AppActivateRequest::new("1234").as_task_id(), Some(1234));
assert_eq!(AppActivateRequest::new(" 42 ").as_task_id(), Some(42));
assert_eq!(AppActivateRequest::new("Notepad").as_task_id(), None);
}
#[test]
fn record_captures_relevant_parts() {
let request = AppActivateRequest::new("My App").with_wait(true);
let record = AppActivateRecord::of(&request);
assert_eq!(record.title, "My App");
assert!(record.wait);
}
}