Skip to main content

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_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
39// Additional per-command metadata that can be passed from other commands (e.g., the Sui CLI) that
40// don't appear in the CLI args.
41pub 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            // Return a non-zero exit code if any test failed
78            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}