agent-tui-usecases 1.1.0

Use cases and ports for agent-tui terminal automation
Documentation
//! Snapshot use case.

use std::sync::Arc;

use crate::domain::SnapshotInput;
use crate::domain::SnapshotOutput;
use crate::usecases::ports::SessionError;
use crate::usecases::ports::SessionRepository;

pub trait SnapshotUseCase: Send + Sync {
    fn execute(&self, input: SnapshotInput) -> Result<SnapshotOutput, SessionError>;
}

pub struct SnapshotUseCaseImpl<R: SessionRepository> {
    repository: Arc<R>,
}

impl<R: SessionRepository> SnapshotUseCaseImpl<R> {
    pub fn new(repository: Arc<R>) -> Self {
        Self { repository }
    }
}

impl<R: SessionRepository> SnapshotUseCase for SnapshotUseCaseImpl<R> {
    fn execute(&self, input: SnapshotInput) -> Result<SnapshotOutput, SessionError> {
        if input.region.is_some() {
            return Err(SessionError::InvalidInput {
                field: "region".to_string(),
                reason: "Named snapshot regions are not supported".to_string(),
            });
        }

        let session = self.repository.resolve(input.session_id.as_ref())?;

        session.update()?;

        let screenshot = session.screen_text();
        let session_id = session.session_id();

        let cursor = if input.include_cursor {
            Some(session.cursor())
        } else {
            None
        };

        let rendered = if input.include_render {
            Some(session.screen_render())
        } else {
            None
        };
        let compact_rendered = if input.include_render {
            Some(session.screen_render_compact())
        } else {
            None
        };

        Ok(SnapshotOutput {
            session_id,
            screenshot,
            cursor,
            rendered,
            compact_rendered,
        })
    }
}

#[cfg(test)]
#[path = "snapshot_tests.rs"]
mod tests;