polyhorn_cli/android/tasks/
mod.rs1use std::collections::HashMap;
4use std::path::PathBuf;
5
6mod build_runtime_library;
7mod find_android_studio;
8mod generate_source_tree;
9mod install;
10mod link_native_libraries;
11mod run;
12
13pub use build_runtime_library::BuildRuntimeLibrary;
14pub use find_android_studio::FindAndroidStudio;
15pub use generate_source_tree::GenerateSourceTree;
16pub use install::Install;
17pub use link_native_libraries::LinkNativeLibraries;
18pub use run::Run;
19
20pub use crate::core::tasks::InstallTarget;
21
22use crate::core::{Manager, Task};
23use crate::Config;
24
25#[derive(Debug)]
27pub struct AndroidContext {
28 pub config: Config,
30
31 pub java_home: Option<PathBuf>,
33
34 pub android_sdk_root: Option<PathBuf>,
37
38 pub products: HashMap<String, PathBuf>,
40}
41
42pub enum AndroidTask {
44 BuildRuntimeLibrary(BuildRuntimeLibrary),
47
48 GenerateSourceTree(GenerateSourceTree),
51
52 FindAndroidStudio(FindAndroidStudio),
57
58 Install(Install),
61
62 InstallTarget(InstallTarget),
65
66 LinkNativeLibraries(LinkNativeLibraries),
69
70 Run(Run),
73}
74
75#[derive(Debug)]
77pub enum AndroidError {
78 UnsupportedHostOS(&'static str),
81
82 CompilationFailure,
86
87 AndroidStudioNotFound(PathBuf),
91
92 JavaNotFound(PathBuf),
96
97 AndroidSDKNotFound(PathBuf),
101
102 AndroidNDKNotFound(PathBuf),
106
107 IO(std::io::Error),
109}
110
111impl From<std::io::Error> for AndroidError {
112 fn from(error: std::io::Error) -> Self {
113 AndroidError::IO(error)
114 }
115}
116
117impl Task for AndroidTask {
118 type Context = AndroidContext;
119 type Error = AndroidError;
120
121 fn verb(&self) -> &str {
122 match self {
123 AndroidTask::BuildRuntimeLibrary(task) => task.verb(),
124 AndroidTask::FindAndroidStudio(task) => task.verb(),
125 AndroidTask::GenerateSourceTree(task) => task.verb(),
126 AndroidTask::LinkNativeLibraries(task) => task.verb(),
127 AndroidTask::Install(task) => task.verb(),
128 AndroidTask::InstallTarget(task) => task.verb(),
129 AndroidTask::Run(task) => task.verb(),
130 }
131 }
132
133 fn message(&self) -> &str {
134 match self {
135 AndroidTask::BuildRuntimeLibrary(task) => task.message(),
136 AndroidTask::FindAndroidStudio(task) => task.message(),
137 AndroidTask::GenerateSourceTree(task) => task.message(),
138 AndroidTask::LinkNativeLibraries(task) => task.message(),
139 AndroidTask::Install(task) => task.message(),
140 AndroidTask::InstallTarget(task) => task.message(),
141 AndroidTask::Run(task) => task.message(),
142 }
143 }
144
145 fn detail(&self) -> &str {
146 match self {
147 AndroidTask::BuildRuntimeLibrary(task) => task.detail(),
148 AndroidTask::FindAndroidStudio(task) => task.detail(),
149 AndroidTask::GenerateSourceTree(task) => task.detail(),
150 AndroidTask::LinkNativeLibraries(task) => task.detail(),
151 AndroidTask::Install(task) => task.detail(),
152 AndroidTask::InstallTarget(task) => task.detail(),
153 AndroidTask::Run(task) => task.detail(),
154 }
155 }
156
157 fn run(
158 &self,
159 context: Self::Context,
160 manager: &mut Manager,
161 ) -> Result<Self::Context, Self::Error> {
162 match self {
163 AndroidTask::BuildRuntimeLibrary(task) => task.run(context, manager),
164 AndroidTask::FindAndroidStudio(task) => task.run(context, manager),
165 AndroidTask::GenerateSourceTree(task) => task.run(context, manager),
166 AndroidTask::LinkNativeLibraries(task) => task.run(context, manager),
167 AndroidTask::Install(task) => task.run(context, manager),
168 AndroidTask::InstallTarget(task) => task
169 .run((), manager)
170 .map_err(|error| AndroidError::IO(error))
171 .map(|_| context),
172 AndroidTask::Run(task) => task.run(context, manager),
173 }
174 }
175}