1use std::sync::Arc;
2
3use cpclib_runner::delegated::{
4 DelegateApplicationDescription, DelegatedRunner, GithubCompilableApplication
5};
6use cpclib_runner::emucontrol::EmulatorFacadeRunner;
7use cpclib_runner::event::EventObserver;
8use cpclib_runner::runner::convgeneric::ConvGenericVersion;
9#[cfg(feature = "fap")]
10use cpclib_runner::runner::fap::FAPVersion;
11use cpclib_runner::runner::hspcompiler::HspCompilerVersion;
12use cpclib_runner::runner::impdisc::ImpDskVersion;
13use cpclib_runner::runner::martine::MartineVersion;
14use cpclib_runner::runner::{ExternRunner, Runner};
15
16use crate::event::{BndBuilderObserved, BndBuilderObserver};
17use crate::runners::assembler::{Assembler, BasmRunner, OrgamsRunner};
18use crate::runners::bndbuild::BndBuildRunner;
19use crate::runners::crunch::CrunchRunner;
20use crate::runners::disassembler::{BdasmRunner, Disassembler};
21use crate::runners::disc::DiscManagerRunner;
22use crate::runners::echo::EchoRunner;
23use crate::runners::fs::cp::CpRunner;
24use crate::runners::fs::mkdir::MkdirRunner;
25use crate::runners::fs::rm::RmRunner;
26use crate::runners::hideur::HideurRunner;
27use crate::runners::imgconverter::ImgConverterRunner;
28use crate::runners::snapshot::SnapshotRunner;
29use crate::runners::xfer::XferRunner;
30use crate::task::InnerTask;
31
32impl InnerTask {
33 #[inline]
34 pub fn configuration<E: EventObserver>(&self) -> Option<DelegateApplicationDescription<E>> {
35 match self {
36 InnerTask::Emulator(e, _) => {
37 match e {
38 crate::runners::emulator::Emulator::EmulatorProxy(e) => {
39 let conf: DelegateApplicationDescription<E> = e.configuration();
40 Some(conf)
41 },
42 crate::runners::emulator::Emulator::EmulatorFacade => None
43 }
44 },
45
46 InnerTask::Assembler(a, _) => {
47 match a {
48 Assembler::Extern(extern_assembler) => {
49 Some(extern_assembler.configuration::<E>())
50 },
51 _ => None
52 }
53 },
54
55 InnerTask::Convgeneric(_) => Some(ConvGenericVersion::default().configuration()),
56 InnerTask::Disassembler(d, _) => {
57 match d {
58 Disassembler::Extern(e) => Some(e.configuration()),
59 _ => None
60 }
61 },
62
63 #[cfg(feature = "fap")]
64 InnerTask::Fap(_) => Some(FAPVersion::default().configuration()),
65
66 InnerTask::HspCompiler(_) => Some(HspCompilerVersion::default().configuration()),
67 InnerTask::ImpDsk(_) => Some(ImpDskVersion::default().configuration()),
68 InnerTask::Martine(_) => Some(MartineVersion::default().configuration()),
69 InnerTask::Tracker(t, _) => Some(t.configuration()),
70
71 _ => None
72 }
73 }
74}
75
76#[inline]
77pub fn execute<E: BndBuilderObserver + 'static>(
78 task: &InnerTask,
79 observer: &Arc<E>
80) -> Result<(), String> {
81 match task {
82 InnerTask::Emulator(e, _) => {
83 match e {
84 crate::runners::emulator::Emulator::EmulatorProxy(e) => {
85 DelegatedRunner::<E>::new(
86 task.configuration::<E>().unwrap(),
87 e.get_command().to_owned()
88 )
89 .run(task.args(), observer)
90 },
91 crate::runners::emulator::Emulator::EmulatorFacade => {
92 EmulatorFacadeRunner::default().run(dbg!(task.args()), observer)
93 },
94 }
95 },
96 InnerTask::Assembler(a, _) => {
97 match a {
98 Assembler::Basm => BasmRunner::default().run(task.args(), observer),
99 Assembler::Orgams => OrgamsRunner::default().run(task.args(), observer),
100 Assembler::Extern(e) => {
101 DelegatedRunner::<E>::new(e.configuration(), a.get_command().to_owned())
102 .run(task.args(), observer)
103 },
104 }
105 },
106 InnerTask::Crunch(_) => CrunchRunner::default().run(task.args(), observer),
107 InnerTask::Disassembler(d, _) => {
108 match d {
109 crate::runners::disassembler::Disassembler::Bdasm => {
110 BdasmRunner::default().run(task.args(), observer)
111 },
112 crate::runners::disassembler::Disassembler::Extern(d) => {
113 DelegatedRunner::<E>::new(d.configuration(), d.get_command().to_owned())
114 .run(task.args(), observer)
115 },
116 }
117 },
118 InnerTask::SongConverter(d, _) => {
119 DelegatedRunner::<E>::new(d.configuration(), d.get_command().to_owned())
120 .run(task.args(), observer)
121 },
122
123 InnerTask::Tracker(d, _) => {
124 DelegatedRunner::<E>::new(d.configuration(), d.get_command().to_owned())
125 .run(task.args(), observer)
126 },
127 InnerTask::BndBuild(_) => BndBuildRunner::default().run(task.args(), observer),
128 InnerTask::Cp(_) => CpRunner::default().run(task.args(), observer),
129 InnerTask::Disc(_) => DiscManagerRunner::default().run(task.args(), observer),
130 InnerTask::Echo(_) => EchoRunner::default().run(task.args(), observer),
131 InnerTask::Extern(_) => ExternRunner::default().run(task.args(), observer),
132 InnerTask::Hideur(_) => HideurRunner::default().run(task.args(), observer),
133 InnerTask::Snapshot(_) => SnapshotRunner::default().run(task.args(), observer),
134 InnerTask::ImgConverter(_) => ImgConverterRunner::default().run(task.args(), observer),
135 InnerTask::ImpDsk(_) => {
136 DelegatedRunner::<E>::new(
137 task.configuration().unwrap(),
138 ImpDskVersion::default().get_command().to_owned()
139 )
140 .run(task.args(), observer)
141 },
142 InnerTask::HspCompiler(_) => {
143 DelegatedRunner::<E>::new(
144 task.configuration().unwrap(),
145 HspCompilerVersion::default().get_command().to_owned()
146 )
147 .run(task.args(), observer)
148 },
149 InnerTask::Martine(_) => {
150 DelegatedRunner::<E>::new(
151 task.configuration().unwrap(),
152 MartineVersion::default().get_command().to_owned()
153 )
154 .run(task.args(), observer)
155 },
156 InnerTask::Mkdir(_) => MkdirRunner::default().run(task.args(), observer),
157 InnerTask::Rm(_) => RmRunner::default().run(task.args(), observer),
158 InnerTask::Xfer(_) => XferRunner::default().run(task.args(), observer),
159 #[cfg(feature = "fap")]
160 InnerTask::Fap(_) => {
161 DelegatedRunner::<E>::new(
162 task.configuration().unwrap(),
163 FAPVersion::default().get_command().to_owned()
164 )
165 .run(task.args(), observer)
166 },
167 InnerTask::Convgeneric(standard_task_arguments) => {
168 DelegatedRunner::<E>::new(
169 task.configuration().unwrap(),
170 ConvGenericVersion::default().get_command().to_owned()
171 )
172 .run(task.args(), observer)
173 },
174 }
175 .or_else(|e| {
176 if task.ignore_errors() {
177 observer.emit_stdout(&format!("[Error ignored] {e}\n"));
178 Ok(())
179 }
180 else {
181 Err(e)
183 }
184 })
185}