1use soma_application::{ApplicationError, ExecuteActionRequest, ExecutionContext};
12use soma_domain::Confirmation;
13
14use crate::{
15 dto::{LauncherExecuteRequest, LauncherExecuteResponse},
16 schema::find_schema,
17 state::PaletteState,
18};
19
20pub enum ExecuteOutcome {
21 Ok(LauncherExecuteResponse),
22 NotFound,
23 Failed(ApplicationError),
24}
25
26pub async fn execute_launcher(
32 state: &PaletteState,
33 request: LauncherExecuteRequest,
34 mut context: ExecutionContext,
35) -> ExecuteOutcome {
36 let snapshot = match state.application().refresh_providers() {
37 Ok(snapshot) => snapshot,
38 Err(error) => return ExecuteOutcome::Failed(error),
39 };
40 if find_schema(&snapshot, &request.id).is_none() {
41 return ExecuteOutcome::NotFound;
42 }
43
44 context.destructive_confirmation = confirmation_for(request.confirm_destructive);
45
46 let action_request = ExecuteActionRequest {
47 action: request.id,
48 params: request.params,
49 };
50
51 match state
52 .application()
53 .execute_action(action_request, context)
54 .await
55 {
56 Ok(response) => ExecuteOutcome::Ok(LauncherExecuteResponse {
57 output: response.output,
58 request_id: response.request_id,
59 }),
60 Err(error) => ExecuteOutcome::Failed(error),
61 }
62}
63
64#[must_use]
69fn confirmation_for(confirm_destructive: bool) -> Confirmation {
70 if confirm_destructive {
71 Confirmation::Confirmed
72 } else {
73 Confirmation::Missing
74 }
75}
76
77#[cfg(test)]
78#[path = "execute_tests.rs"]
79mod tests;