1use clap::Parser;
5use move_cli::base::test::UnitTestResult;
6use move_package_alt_compilation::build_config::BuildConfig;
7use std::path::Path;
8use sui_package_alt::SuiFlavor;
9use sui_sdk::wallet_context::WalletContext;
10
11pub mod build;
12pub mod cache_package;
13pub mod coverage;
14pub mod disassemble;
15pub mod format;
16pub mod lint;
17pub mod migrate;
18pub mod new;
19pub mod summary;
20pub mod unit_test;
21pub mod update_deps;
22
23#[derive(Parser)]
24pub enum Command {
25 Build(build::Build),
26 Coverage(coverage::Coverage),
27 #[command(hide = true)]
28 CachePackage(cache_package::CachePackage),
29 Disassemble(disassemble::Disassemble),
30 Format(format::Format),
31 Lint(lint::Lint),
32 Migrate(migrate::Migrate),
33 New(new::New),
34 Test(unit_test::Test),
35 Summary(summary::Summary),
36 UpdateDeps(update_deps::UpdateDeps),
37}
38
39pub enum CommandMeta {
42 Summary(summary::PackageSummaryMetadata),
43}
44
45pub async fn execute_move_command(
46 package_path: Option<&Path>,
47 build_config: BuildConfig,
48 command: Command,
49 command_meta: Option<CommandMeta>,
50 wallet: &WalletContext,
51) -> anyhow::Result<()> {
52 let flavor = SuiFlavor::with_client(wallet);
53 match command {
54 Command::Build(c) => c.execute(package_path, build_config, wallet).await,
55 Command::CachePackage(c) => c.execute(flavor).await,
56 Command::Coverage(c) => c.execute(package_path, build_config, flavor).await,
57 Command::Disassemble(c) => c.execute(package_path, build_config, flavor).await,
58 Command::Format(c) => c.execute().await,
59 Command::Lint(c) => c.execute(package_path, build_config, flavor).await,
60 Command::Migrate(c) => c.execute(package_path, build_config, flavor).await,
61 Command::New(c) => c.execute(package_path),
62 Command::Summary(s) => {
63 let additional_metadata = command_meta
64 .map(|meta| {
65 let CommandMeta::Summary(metadata) = meta;
66 metadata
67 })
68 .unwrap_or_default();
69 s.execute(package_path, build_config, flavor, additional_metadata)
70 .await
71 }
72 Command::Test(c) => {
73 let result = c
74 .execute(package_path, build_config, wallet, flavor)
75 .await?;
76
77 if let UnitTestResult::Failure = result {
79 std::process::exit(1)
80 }
81
82 Ok(())
83 }
84 Command::UpdateDeps(c) => c.execute(package_path, build_config, wallet, flavor).await,
85 }
86}