sui_move/
lib.rs

1// Copyright (c) Mysten Labs, Inc.
2// SPDX-License-Identifier: Apache-2.0
3
4use clap::Parser;
5use move_cli::base::test::UnitTestResult;
6use move_package_alt_compilation::build_config::BuildConfig;
7use std::path::Path;
8use sui_sdk::wallet_context::WalletContext;
9
10pub mod build;
11pub mod cache_package;
12pub mod coverage;
13pub mod disassemble;
14pub mod migrate;
15pub mod new;
16pub mod summary;
17pub mod unit_test;
18pub mod update_deps;
19
20#[derive(Parser)]
21pub enum Command {
22    Build(build::Build),
23    Coverage(coverage::Coverage),
24    #[command(hide = true)]
25    CachePackage(cache_package::CachePackage),
26    Disassemble(disassemble::Disassemble),
27    Migrate(migrate::Migrate),
28    New(new::New),
29    Test(unit_test::Test),
30    Summary(summary::Summary),
31    UpdateDeps(update_deps::UpdateDeps),
32}
33
34// Additional per-command metadata that can be passed from other commands (e.g., the Sui CLI) that
35// don't appear in the CLI args.
36pub enum CommandMeta {
37    Summary(summary::PackageSummaryMetadata),
38}
39
40pub async fn execute_move_command(
41    package_path: Option<&Path>,
42    build_config: BuildConfig,
43    command: Command,
44    command_meta: Option<CommandMeta>,
45    wallet: &WalletContext,
46) -> anyhow::Result<()> {
47    match command {
48        Command::Build(c) => c.execute(package_path, build_config, wallet).await,
49        Command::CachePackage(c) => c.execute().await,
50        Command::Coverage(c) => c.execute(package_path, build_config).await,
51        Command::Disassemble(c) => c.execute(package_path, build_config).await,
52        Command::Migrate(c) => c.execute(package_path, build_config).await,
53        Command::New(c) => c.execute(package_path),
54        Command::Summary(s) => {
55            let additional_metadata = command_meta
56                .map(|meta| {
57                    let CommandMeta::Summary(metadata) = meta;
58                    metadata
59                })
60                .unwrap_or_default();
61            s.execute(package_path, build_config, additional_metadata)
62                .await
63        }
64        Command::Test(c) => {
65            let result = c.execute(package_path, build_config, wallet).await?;
66
67            // Return a non-zero exit code if any test failed
68            if let UnitTestResult::Failure = result {
69                std::process::exit(1)
70            }
71
72            Ok(())
73        }
74        Command::UpdateDeps(c) => c.execute(package_path, build_config, wallet).await,
75    }
76}