agent_tui_usecases/usecases/
snapshot.rs1use 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;