cpclib_bndbuild/
executor.rs

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            // dbg!("There was an error", &e);
182            Err(e)
183        }
184    })
185}