android_studio_script.rs 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. use super::{detect_target_ok, ensure_init, init_dot_cargo, with_config, Error, MobileTarget};
  2. use crate::Result;
  3. use clap::Parser;
  4. use cargo_mobile::{
  5. android::{env::Env, target::Target},
  6. opts::{NoiseLevel, Profile},
  7. target::{call_for_targets_with_fallback, TargetTrait},
  8. };
  9. #[derive(Debug, Parser)]
  10. pub struct Options {
  11. /// Targets to build.
  12. #[clap(
  13. short,
  14. long = "target",
  15. multiple_occurrences(true),
  16. multiple_values(true),
  17. default_value = Target::DEFAULT_KEY,
  18. value_parser(clap::builder::PossibleValuesParser::new(Target::name_list()))
  19. )]
  20. targets: Option<Vec<String>>,
  21. /// Builds with the release flag
  22. #[clap(short, long)]
  23. release: bool,
  24. }
  25. pub fn command(options: Options) -> Result<()> {
  26. let profile = if options.release {
  27. Profile::Release
  28. } else {
  29. Profile::Debug
  30. };
  31. let noise_level = NoiseLevel::Polite;
  32. with_config(|root_conf, config, metadata| {
  33. ensure_init(config.project_dir(), MobileTarget::Android)
  34. .map_err(|e| Error::ProjectNotInitialized(e.to_string()))?;
  35. let env = Env::new().map_err(Error::EnvInitFailed)?;
  36. init_dot_cargo(root_conf, Some(&env)).map_err(Error::InitDotCargo)?;
  37. call_for_targets_with_fallback(
  38. options.targets.unwrap_or_default().iter(),
  39. &detect_target_ok,
  40. &env,
  41. |target: &Target| {
  42. target
  43. .build(config, metadata, &env, noise_level, true, profile)
  44. .map_err(Error::AndroidStudioScriptFailed)
  45. },
  46. )
  47. .map_err(|e| Error::TargetInvalid(e.to_string()))?
  48. })
  49. .map_err(Into::into)
  50. }