Skip to main content

agent_tui_usecases/usecases/
snapshot.rs

1//! Snapshot use case.
2
3use std::sync::Arc;
4
5use crate::domain::SnapshotInput;
6use crate::domain::SnapshotOutput;
7use crate::usecases::ports::SessionError;
8use crate::usecases::ports::SessionRepository;
9
10pub trait SnapshotUseCase: Send + Sync {
11    fn execute(&self, input: SnapshotInput) -> Result<SnapshotOutput, SessionError>;
12}
13
14pub struct SnapshotUseCaseImpl<R: SessionRepository> {
15    repository: Arc<R>,
16}
17
18impl<R: SessionRepository> SnapshotUseCaseImpl<R> {
19    pub fn new(repository: Arc<R>) -> Self {
20        Self { repository }
21    }
22}
23
24impl<R: SessionRepository> SnapshotUseCase for SnapshotUseCaseImpl<R> {
25    fn execute(&self, input: SnapshotInput) -> Result<SnapshotOutput, SessionError> {
26        if input.region.is_some() {
27            return Err(SessionError::InvalidInput {
28                field: "region".to_string(),
29                reason: "Named snapshot regions are not supported".to_string(),
30            });
31        }
32
33        let session = self.repository.resolve(input.session_id.as_ref())?;
34
35        session.update()?;
36
37        let screenshot = session.screen_text();
38        let session_id = session.session_id();
39
40        let cursor = if input.include_cursor {
41            Some(session.cursor())
42        } else {
43            None
44        };
45
46        let rendered = if input.include_render {
47            Some(session.screen_render())
48        } else {
49            None
50        };
51        let compact_rendered = if input.include_render {
52            Some(session.screen_render_compact())
53        } else {
54            None
55        };
56
57        Ok(SnapshotOutput {
58            session_id,
59            screenshot,
60            cursor,
61            rendered,
62            compact_rendered,
63        })
64    }
65}
66
67#[cfg(test)]
68#[path = "snapshot_tests.rs"]
69mod tests;