use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, utoipa::ToSchema)]
#[serde(rename_all = "snake_case")]
pub enum SessionOrigin {
TrustyMpm,
External,
}
impl SessionOrigin {
pub fn classify(name: &str) -> Self {
if name.starts_with("tmpm-") || name.starts_with("trusty-mpm-") {
Self::TrustyMpm
} else {
Self::External
}
}
pub fn label(&self) -> &'static str {
match self {
Self::TrustyMpm => "trusty_mpm",
Self::External => "external",
}
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, utoipa::ToSchema)]
pub struct ExternalSession {
pub name: String,
pub origin: SessionOrigin,
pub attached: bool,
pub created: i64,
}
impl ExternalSession {
pub fn new(name: impl Into<String>, attached: bool, created: i64) -> Self {
let name = name.into();
let origin = SessionOrigin::classify(&name);
Self {
name,
origin,
attached,
created,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn classifies_trusty_mpm_prefixes() {
assert_eq!(
SessionOrigin::classify("tmpm-brave-otter"),
SessionOrigin::TrustyMpm
);
assert_eq!(
SessionOrigin::classify("trusty-mpm-abc123"),
SessionOrigin::TrustyMpm
);
}
#[test]
fn classifies_external() {
assert_eq!(SessionOrigin::classify("work"), SessionOrigin::External);
assert_eq!(SessionOrigin::classify("0"), SessionOrigin::External);
assert_eq!(
SessionOrigin::classify("my-tmpm-thing"),
SessionOrigin::External
);
}
#[test]
fn origin_labels_are_stable() {
assert_eq!(SessionOrigin::TrustyMpm.label(), "trusty_mpm");
assert_eq!(SessionOrigin::External.label(), "external");
}
#[test]
fn external_session_classifies_on_construction() {
let internal = ExternalSession::new("tmpm-x", true, 100);
assert_eq!(internal.origin, SessionOrigin::TrustyMpm);
let external = ExternalSession::new("vim", false, 200);
assert_eq!(external.origin, SessionOrigin::External);
}
#[test]
fn external_session_json_roundtrip() {
let session = ExternalSession::new("trusty-mpm-1", true, 1_700_000_000);
let json = serde_json::to_string(&session).unwrap();
let back: ExternalSession = serde_json::from_str(&json).unwrap();
assert_eq!(back, session);
}
}