//! Core feature model for Rabby, a Rust/Tauri terminal workspace inspired by Tabby. //! //! This crate is intentionally dependency-light so terminal/profile/session behavior can be //! unit-tested without starting the desktop shell. pub mod feature; pub mod workspace; pub use feature::{ all_features, feature_by_key, feature_matrix, FeatureArea, FeatureSpec, FeatureStatus, }; pub use workspace::{ConnectionKind, PaneNode, Profile, SplitAxis, Tab, Workspace}; impl Workspace { pub fn feature_matrix() -> Vec<(&'static str, &'static str)> { feature_matrix() } } pub fn slug(input: &str) -> String { let mut out = String::new(); let mut last_dash = false; for ch in input.trim().chars() { if ch.is_ascii_alphanumeric() { out.push(ch.to_ascii_lowercase()); last_dash = false; } else if !last_dash { out.push('-'); last_dash = true; } } out.trim_matches('-').to_string() } #[cfg(test)] mod tests { use super::*; #[test] fn slug_normalizes_profile_ids() { assert_eq!(slug(" SSH: Prod Box "), "ssh-prod-box"); } #[test] fn exported_feature_matrix_mentions_tabby_capabilities() { let text = Workspace::feature_matrix() .iter() .map(|(a, b)| format!("{a} {b}")) .collect::>() .join("\n") .to_lowercase(); for needle in [ "terminal", "ssh", "telnet", "serial", "split", "unicode", "quake", "zmodem", "plugin", "portable", "shortcut", "theme", "sftp", "secret", ] { assert!(text.contains(needle), "missing {needle}"); } } }