holodeck_simctl_tui/state/
event.rs1use std::path::PathBuf;
2
3use holodeck_core::models::{Appearance, DeviceType, InstalledApp, PrivacyAction, PrivacyPermission, Runtime, Simulator};
4use uuid::Uuid;
5
6use super::app_state::AppState;
7use super::key::Key;
8
9#[derive(Debug, Clone)]
10pub enum AppEvent {
11 Refreshed(Vec<Simulator>),
12 RefreshFailed(String),
13 Key(Key),
14 Resized { rows: i64, cols: i64 },
15 PollTick,
16 OperationCompleted(Uuid),
17 OperationFailed(Uuid, String),
18 RecordingStarted(Uuid, PathBuf),
19 RecordingStopped(Option<PathBuf>),
20 RecordingFailed(String),
21 ScreenshotSaved(PathBuf),
22 ScreenshotFailed(String),
23 AppearanceChanged(Uuid, Appearance),
24 AppearanceFailed(String),
25 TargetsLoaded { device_types: Vec<DeviceType>, runtimes: Vec<Runtime> },
26 TargetsFailed(String),
27 SimulatorCreated(Uuid, String),
28 SimulatorCreateFailed(String),
29 AppsLoaded(Vec<InstalledApp>),
30 AppsLoadFailed(String),
31 PrivacyApplied { bundle_id: String },
32 PrivacyApplyFailed(String),
33 UrlHistoryLoaded(Vec<String>),
34 UrlOpened { url: String, history: Vec<String> },
35 UrlOpenFailed(String),
36 AppLaunched { bundle_id: String },
37 AppLaunchFailed(String),
38}
39
40#[derive(Debug, Clone, PartialEq)]
41pub enum SideEffect {
42 Boot(Uuid),
43 Shutdown(Uuid),
44 Refresh,
45 StartRecording(Uuid),
46 StopRecording,
47 CaptureScreenshot(Uuid),
48 SetAppearance(Uuid, Appearance),
49 EraseSimulator(Uuid),
50 DeleteSimulator(Uuid),
51 LoadTargets,
52 CreateSimulator { name: String, device_type: DeviceType, runtime: Runtime },
53 FocusSimulator(Uuid),
54 LoadInstalledApps(Uuid),
55 ApplyPrivacy { udid: Uuid, action: PrivacyAction, permission: PrivacyPermission, bundle_id: String },
56 LoadUrlHistory,
57 OpenUrl { udid: Uuid, url: String },
58 LaunchApp { udid: Uuid, bundle_id: String, language: Option<String> },
59}
60
61#[derive(Debug, Clone, PartialEq)]
62pub struct ReducerOutput {
63 pub state: AppState,
64 pub effects: Vec<SideEffect>,
65}
66
67impl ReducerOutput {
68 pub fn new(state: AppState) -> Self {
69 Self { state, effects: Vec::new() }
70 }
71
72 pub fn with_effects(state: AppState, effects: Vec<SideEffect>) -> Self {
73 Self { state, effects }
74 }
75}