agent_tui_adapters/adapters/daemon/
usecase_container.rs1use 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}