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::BuildConfig;
7use std::path::Path;
8use sui_move_build::{SuiPackageHooks, implicit_deps, set_sui_flavor};
9use sui_package_management::system_package_versions::latest_system_packages;
10
11pub mod build;
12pub mod coverage;
13pub mod disassemble;
14pub mod manage_package;
15pub mod migrate;
16pub mod new;
17pub mod summary;
18pub mod unit_test;
19
20#[derive(Parser)]
21pub enum Command {
22    Build(build::Build),
23    Coverage(coverage::Coverage),
24    Disassemble(disassemble::Disassemble),
25    ManagePackage(manage_package::ManagePackage),
26    Migrate(migrate::Migrate),
27    New(new::New),
28    Test(unit_test::Test),
29    Summary(summary::Summary),
30}
31
32// Additional per-command metadata that can be passed from other commands (e.g., the Sui CLI) that
33// don't appear in the CLI args.
34pub enum CommandMeta {
35    Summary(summary::PackageSummaryMetadata),
36}
37
38pub fn execute_move_command(
39    package_path: Option<&Path>,
40    mut build_config: BuildConfig,
41    command: Command,
42    command_meta: Option<CommandMeta>,
43) -> anyhow::Result<()> {
44    if let Some(err_msg) = set_sui_flavor(&mut build_config) {
45        anyhow::bail!(err_msg);
46    }
47
48    build_config.implicit_dependencies = implicit_deps(latest_system_packages());
49
50    move_package::package_hooks::register_package_hooks(Box::new(SuiPackageHooks));
51    match command {
52        Command::Build(c) => c.execute(package_path, build_config),
53        Command::Coverage(c) => c.execute(package_path, build_config),
54        Command::Disassemble(c) => c.execute(package_path, build_config),
55        Command::ManagePackage(c) => c.execute(package_path, build_config),
56        Command::Migrate(c) => c.execute(package_path, build_config),
57        Command::New(c) => c.execute(package_path),
58        Command::Summary(s) => {
59            let additional_metadata = command_meta
60                .map(|meta| {
61                    let CommandMeta::Summary(metadata) = meta;
62                    metadata
63                })
64                .unwrap_or_default();
65            s.execute(package_path, build_config, additional_metadata)
66        }
67
68        Command::Test(c) => {
69            let result = c.execute(package_path, build_config)?;
70
71            // Return a non-zero exit code if any test failed
72            if let UnitTestResult::Failure = result {
73                std::process::exit(1)
74            }
75
76            Ok(())
77        }
78    }
79}