use serde::{Deserialize, Serialize};
use crate::{
id::{DefinitionId, InstanceId},
session::TearSession,
};
#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "kebab-case")]
pub enum Durability {
ProcessBound,
}
impl Default for Durability {
fn default() -> Self {
Self::ProcessBound
}
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct LiveSession {
pub definition: DefinitionId,
#[serde(default)]
pub durability: Durability,
pub session: TearSession,
}
impl LiveSession {
#[must_use]
pub fn new(definition: DefinitionId, session: TearSession) -> Self {
Self {
definition,
durability: Durability::ProcessBound,
session,
}
}
#[must_use]
pub fn instance(&self) -> InstanceId {
self.session.id
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::id::{DefinitionId, SessionId, WindowId};
use crate::session::{SessionSource, SessionState};
use std::collections::BTreeMap;
use std::path::Path;
fn sample_session() -> TearSession {
TearSession {
id: SessionId(1234),
name: "demo".into(),
windows: BTreeMap::new(),
panes: BTreeMap::new(),
active_window: WindowId::NULL,
state: SessionState::Active,
created_at_unix: 0,
description: String::new(),
source: SessionSource::Human,
}
}
#[test]
fn durability_has_no_restart_surviving_value() {
let d = Durability::default();
match d {
Durability::ProcessBound => {}
}
}
#[test]
fn live_session_links_to_its_definition_and_is_process_bound() {
let def = DefinitionId::from_project(Path::new("/code/pleme-io/mado"));
let live = LiveSession::new(def, sample_session());
assert_eq!(live.definition, def);
assert_eq!(live.durability, Durability::ProcessBound);
assert_eq!(live.instance(), live.session.id);
}
#[test]
fn live_session_serde_round_trips() {
let def = DefinitionId::from_project(Path::new("/x"));
let live = LiveSession::new(def, sample_session());
let json = serde_json::to_string(&live).unwrap();
let back: LiveSession = serde_json::from_str(&json).unwrap();
assert_eq!(live, back);
}
}