Skip to main content

agent_tui_adapters/adapters/daemon/
usecase_container.rs

1//! Adapter use case wiring.
2
3use std::sync::Arc;
4use std::sync::atomic::AtomicBool;
5
6use crate::usecases::AssertUseCaseImpl;
7use crate::usecases::AttachUseCaseImpl;
8use crate::usecases::CleanupUseCaseImpl;
9use crate::usecases::KeydownUseCaseImpl;
10use crate::usecases::KeystrokeUseCaseImpl;
11use crate::usecases::KeyupUseCaseImpl;
12use crate::usecases::KillUseCaseImpl;
13use crate::usecases::ResizeUseCaseImpl;
14use crate::usecases::RestartUseCaseImpl;
15use crate::usecases::SessionsUseCaseImpl;
16use crate::usecases::ShutdownUseCaseImpl;
17use crate::usecases::SnapshotUseCaseImpl;
18use crate::usecases::SpawnUseCaseImpl;
19use crate::usecases::TerminalWriteUseCaseImpl;
20use crate::usecases::TypeUseCaseImpl;
21use crate::usecases::WaitUseCaseImpl;
22use crate::usecases::ports::Clock;
23use crate::usecases::ports::SessionRepository;
24use crate::usecases::ports::ShutdownNotifierHandle;
25
26pub struct UseCaseContainer<R: SessionRepository + 'static> {
27    pub session: SessionUseCases<R>,
28    pub snapshot: SnapshotUseCases<R>,
29    pub input: InputUseCases<R>,
30    pub diagnostics: DiagnosticsUseCases<R>,
31    pub wait: WaitUseCaseImpl<R>,
32}
33
34pub struct SessionUseCases<R: SessionRepository + 'static> {
35    pub spawn: SpawnUseCaseImpl<R>,
36    pub kill: KillUseCaseImpl<R>,
37    pub sessions: SessionsUseCaseImpl<R>,
38    pub restart: RestartUseCaseImpl<R>,
39    pub attach: AttachUseCaseImpl<R>,
40    pub resize: ResizeUseCaseImpl<R>,
41    pub cleanup: CleanupUseCaseImpl<R>,
42    pub assert: AssertUseCaseImpl<R>,
43}
44
45pub struct SnapshotUseCases<R: SessionRepository + 'static> {
46    pub snapshot: SnapshotUseCaseImpl<R>,
47}
48
49pub struct InputUseCases<R: SessionRepository + 'static> {
50    pub keystroke: KeystrokeUseCaseImpl<R>,
51    pub type_text: TypeUseCaseImpl<R>,
52    pub keydown: KeydownUseCaseImpl<R>,
53    pub keyup: KeyupUseCaseImpl<R>,
54}
55
56pub struct DiagnosticsUseCases<R: SessionRepository + 'static> {
57    pub terminal_write: TerminalWriteUseCaseImpl<R>,
58    pub shutdown: ShutdownUseCaseImpl,
59}
60
61impl<R: SessionRepository + 'static> UseCaseContainer<R> {
62    pub fn new(
63        repository: Arc<R>,
64        clock: Arc<dyn Clock>,
65        shutdown_flag: Arc<AtomicBool>,
66        shutdown_notifier: ShutdownNotifierHandle,
67    ) -> Self {
68        Self {
69            session: SessionUseCases {
70                spawn: SpawnUseCaseImpl::new(Arc::clone(&repository)),
71                kill: KillUseCaseImpl::new(Arc::clone(&repository)),
72                sessions: SessionsUseCaseImpl::new(Arc::clone(&repository)),
73                restart: RestartUseCaseImpl::new(Arc::clone(&repository)),
74                attach: AttachUseCaseImpl::new(Arc::clone(&repository)),
75                resize: ResizeUseCaseImpl::new(Arc::clone(&repository)),
76                cleanup: CleanupUseCaseImpl::new(Arc::clone(&repository)),
77                assert: AssertUseCaseImpl::new(Arc::clone(&repository)),
78            },
79            snapshot: SnapshotUseCases {
80                snapshot: SnapshotUseCaseImpl::new(Arc::clone(&repository)),
81            },
82            input: InputUseCases {
83                keystroke: KeystrokeUseCaseImpl::new(Arc::clone(&repository)),
84                type_text: TypeUseCaseImpl::new(Arc::clone(&repository)),
85                keydown: KeydownUseCaseImpl::new(Arc::clone(&repository)),
86                keyup: KeyupUseCaseImpl::new(Arc::clone(&repository)),
87            },
88            diagnostics: DiagnosticsUseCases {
89                terminal_write: TerminalWriteUseCaseImpl::new(Arc::clone(&repository)),
90                shutdown: ShutdownUseCaseImpl::new(shutdown_flag, shutdown_notifier),
91            },
92            wait: WaitUseCaseImpl::new(repository, clock),
93        }
94    }
95}