atagen

matrix-rust-sdk

public
Star0
Watch0
ssh://brewery@pls.lobotomise.me:33/atagen/matrix-rust-sdk.git

Blame: xtask/src/ci.rs

7ff8adafe9e4atagen2026-10-22 12:30 UTC1
use std::{
7ff8adafe9e4atagen2026-10-22 12:30 UTC2
    collections::BTreeMap,
7ff8adafe9e4atagen2026-10-22 12:30 UTC3
    env::consts::{DLL_PREFIX, DLL_SUFFIX},
7ff8adafe9e4atagen2026-10-22 12:30 UTC4
    fmt::Display,
7ff8adafe9e4atagen2026-10-22 12:30 UTC5
};
7ff8adafe9e4atagen2026-10-22 12:30 UTC6
7ff8adafe9e4atagen2026-10-22 12:30 UTC7
use clap::{Args, Subcommand, ValueEnum};
7ff8adafe9e4atagen2026-10-22 12:30 UTC8
use xshell::cmd;
7ff8adafe9e4atagen2026-10-22 12:30 UTC9
7ff8adafe9e4atagen2026-10-22 12:30 UTC10
use crate::{DenyWarnings, NIGHTLY, Result, build_docs, sh, workspace};
7ff8adafe9e4atagen2026-10-22 12:30 UTC11
7ff8adafe9e4atagen2026-10-22 12:30 UTC12
const WASM_TIMEOUT_ENV_KEY: &str = "WASM_BINDGEN_TEST_TIMEOUT";
7ff8adafe9e4atagen2026-10-22 12:30 UTC13
const WASM_TIMEOUT_VALUE: &str = "180";
7ff8adafe9e4atagen2026-10-22 12:30 UTC14
7ff8adafe9e4atagen2026-10-22 12:30 UTC15
#[derive(Args)]
7ff8adafe9e4atagen2026-10-22 12:30 UTC16
pub struct CiArgs {
7ff8adafe9e4atagen2026-10-22 12:30 UTC17
    #[clap(subcommand)]
7ff8adafe9e4atagen2026-10-22 12:30 UTC18
    cmd: Option<CiCommand>,
7ff8adafe9e4atagen2026-10-22 12:30 UTC19
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC20
7ff8adafe9e4atagen2026-10-22 12:30 UTC21
/// The kind of runner for WebAssembly tests run with `wasm-pack test`.
7ff8adafe9e4atagen2026-10-22 12:30 UTC22
#[derive(Clone, Copy, Debug, Default, ValueEnum)]
7ff8adafe9e4atagen2026-10-22 12:30 UTC23
enum WasmTestRunner {
7ff8adafe9e4atagen2026-10-22 12:30 UTC24
    // Run with all available runners.
7ff8adafe9e4atagen2026-10-22 12:30 UTC25
    #[default]
7ff8adafe9e4atagen2026-10-22 12:30 UTC26
    All,
7ff8adafe9e4atagen2026-10-22 12:30 UTC27
    // Run with the Node.js runner.
7ff8adafe9e4atagen2026-10-22 12:30 UTC28
    Node,
7ff8adafe9e4atagen2026-10-22 12:30 UTC29
    // Run with the Firefox runner.
7ff8adafe9e4atagen2026-10-22 12:30 UTC30
    Firefox,
7ff8adafe9e4atagen2026-10-22 12:30 UTC31
    // Run with the Chrome runner.
7ff8adafe9e4atagen2026-10-22 12:30 UTC32
    Chrome,
7ff8adafe9e4atagen2026-10-22 12:30 UTC33
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC34
7ff8adafe9e4atagen2026-10-22 12:30 UTC35
impl Display for WasmTestRunner {
7ff8adafe9e4atagen2026-10-22 12:30 UTC36
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
7ff8adafe9e4atagen2026-10-22 12:30 UTC37
        match self {
7ff8adafe9e4atagen2026-10-22 12:30 UTC38
            WasmTestRunner::All => write!(f, "all"),
7ff8adafe9e4atagen2026-10-22 12:30 UTC39
            WasmTestRunner::Node => write!(f, "node"),
7ff8adafe9e4atagen2026-10-22 12:30 UTC40
            WasmTestRunner::Firefox => write!(f, "firefox"),
7ff8adafe9e4atagen2026-10-22 12:30 UTC41
            WasmTestRunner::Chrome => write!(f, "chrome"),
7ff8adafe9e4atagen2026-10-22 12:30 UTC42
        }
7ff8adafe9e4atagen2026-10-22 12:30 UTC43
    }
7ff8adafe9e4atagen2026-10-22 12:30 UTC44
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC45
7ff8adafe9e4atagen2026-10-22 12:30 UTC46
#[derive(Subcommand)]
7ff8adafe9e4atagen2026-10-22 12:30 UTC47
enum CiCommand {
7ff8adafe9e4atagen2026-10-22 12:30 UTC48
    /// Check style
7ff8adafe9e4atagen2026-10-22 12:30 UTC49
    Style,
7ff8adafe9e4atagen2026-10-22 12:30 UTC50
7ff8adafe9e4atagen2026-10-22 12:30 UTC51
    /// Check for typos
7ff8adafe9e4atagen2026-10-22 12:30 UTC52
    Typos,
7ff8adafe9e4atagen2026-10-22 12:30 UTC53
7ff8adafe9e4atagen2026-10-22 12:30 UTC54
    /// Check clippy lints
7ff8adafe9e4atagen2026-10-22 12:30 UTC55
    Clippy,
7ff8adafe9e4atagen2026-10-22 12:30 UTC56
7ff8adafe9e4atagen2026-10-22 12:30 UTC57
    /// Check documentation
7ff8adafe9e4atagen2026-10-22 12:30 UTC58
    Docs,
7ff8adafe9e4atagen2026-10-22 12:30 UTC59
7ff8adafe9e4atagen2026-10-22 12:30 UTC60
    /// Run tests with a specific feature set
7ff8adafe9e4atagen2026-10-22 12:30 UTC61
    TestFeatures {
7ff8adafe9e4atagen2026-10-22 12:30 UTC62
        #[clap(subcommand)]
7ff8adafe9e4atagen2026-10-22 12:30 UTC63
        cmd: Option<FeatureSet>,
7ff8adafe9e4atagen2026-10-22 12:30 UTC64
    },
7ff8adafe9e4atagen2026-10-22 12:30 UTC65
7ff8adafe9e4atagen2026-10-22 12:30 UTC66
    /// Run clippy checks for the wasm target
7ff8adafe9e4atagen2026-10-22 12:30 UTC67
    Wasm {
7ff8adafe9e4atagen2026-10-22 12:30 UTC68
        #[clap(subcommand)]
7ff8adafe9e4atagen2026-10-22 12:30 UTC69
        cmd: Option<WasmFeatureSet>,
7ff8adafe9e4atagen2026-10-22 12:30 UTC70
    },
7ff8adafe9e4atagen2026-10-22 12:30 UTC71
7ff8adafe9e4atagen2026-10-22 12:30 UTC72
    /// Run tests with `wasm-pack test`
7ff8adafe9e4atagen2026-10-22 12:30 UTC73
    WasmPack {
7ff8adafe9e4atagen2026-10-22 12:30 UTC74
        #[clap(subcommand)]
7ff8adafe9e4atagen2026-10-22 12:30 UTC75
        cmd: Option<WasmFeatureSet>,
7ff8adafe9e4atagen2026-10-22 12:30 UTC76
7ff8adafe9e4atagen2026-10-22 12:30 UTC77
        #[clap(long, default_value_t = WasmTestRunner::All)]
7ff8adafe9e4atagen2026-10-22 12:30 UTC78
        runner: WasmTestRunner,
7ff8adafe9e4atagen2026-10-22 12:30 UTC79
    },
7ff8adafe9e4atagen2026-10-22 12:30 UTC80
7ff8adafe9e4atagen2026-10-22 12:30 UTC81
    /// Run tests for the different crypto crate features
7ff8adafe9e4atagen2026-10-22 12:30 UTC82
    TestCrypto,
7ff8adafe9e4atagen2026-10-22 12:30 UTC83
7ff8adafe9e4atagen2026-10-22 12:30 UTC84
    /// Check that bindings can be generated
7ff8adafe9e4atagen2026-10-22 12:30 UTC85
    Bindings,
7ff8adafe9e4atagen2026-10-22 12:30 UTC86
7ff8adafe9e4atagen2026-10-22 12:30 UTC87
    /// Check that the examples compile
7ff8adafe9e4atagen2026-10-22 12:30 UTC88
    Examples,
7ff8adafe9e4atagen2026-10-22 12:30 UTC89
7ff8adafe9e4atagen2026-10-22 12:30 UTC90
    /// Run the workspace tests and create a code coverage report using
7ff8adafe9e4atagen2026-10-22 12:30 UTC91
    /// llvm-cov.
7ff8adafe9e4atagen2026-10-22 12:30 UTC92
    ///
7ff8adafe9e4atagen2026-10-22 12:30 UTC93
    /// Note: This requires the docker container for the integration tests to be
7ff8adafe9e4atagen2026-10-22 12:30 UTC94
    /// running.
7ff8adafe9e4atagen2026-10-22 12:30 UTC95
    Coverage {
7ff8adafe9e4atagen2026-10-22 12:30 UTC96
        /// Specify the output format that we're going to use.
7ff8adafe9e4atagen2026-10-22 12:30 UTC97
        #[arg(long, short, default_value_t = CoverageOutputFormat::Text)]
7ff8adafe9e4atagen2026-10-22 12:30 UTC98
        output_format: CoverageOutputFormat,
7ff8adafe9e4atagen2026-10-22 12:30 UTC99
    },
7ff8adafe9e4atagen2026-10-22 12:30 UTC100
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC101
7ff8adafe9e4atagen2026-10-22 12:30 UTC102
#[derive(Clone, Debug, Default, ValueEnum)]
7ff8adafe9e4atagen2026-10-22 12:30 UTC103
enum CoverageOutputFormat {
7ff8adafe9e4atagen2026-10-22 12:30 UTC104
    /// Output the coverage report to stdout.
7ff8adafe9e4atagen2026-10-22 12:30 UTC105
    #[default]
7ff8adafe9e4atagen2026-10-22 12:30 UTC106
    Text,
7ff8adafe9e4atagen2026-10-22 12:30 UTC107
    /// Output the coverage report as a HTML report in the target/llvm-cov/html
7ff8adafe9e4atagen2026-10-22 12:30 UTC108
    /// folder.
7ff8adafe9e4atagen2026-10-22 12:30 UTC109
    Html,
7ff8adafe9e4atagen2026-10-22 12:30 UTC110
    /// Output the coverage report as the custom Codecov coverage format.
7ff8adafe9e4atagen2026-10-22 12:30 UTC111
    /// folder.
7ff8adafe9e4atagen2026-10-22 12:30 UTC112
    Codecov,
7ff8adafe9e4atagen2026-10-22 12:30 UTC113
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC114
7ff8adafe9e4atagen2026-10-22 12:30 UTC115
impl Display for CoverageOutputFormat {
7ff8adafe9e4atagen2026-10-22 12:30 UTC116
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
7ff8adafe9e4atagen2026-10-22 12:30 UTC117
        match self {
7ff8adafe9e4atagen2026-10-22 12:30 UTC118
            CoverageOutputFormat::Text => write!(f, "text"),
7ff8adafe9e4atagen2026-10-22 12:30 UTC119
            CoverageOutputFormat::Html => write!(f, "html"),
7ff8adafe9e4atagen2026-10-22 12:30 UTC120
            CoverageOutputFormat::Codecov => write!(f, "codecov"),
7ff8adafe9e4atagen2026-10-22 12:30 UTC121
        }
7ff8adafe9e4atagen2026-10-22 12:30 UTC122
    }
7ff8adafe9e4atagen2026-10-22 12:30 UTC123
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC124
7ff8adafe9e4atagen2026-10-22 12:30 UTC125
#[derive(Subcommand, PartialEq, Eq, PartialOrd, Ord)]
7ff8adafe9e4atagen2026-10-22 12:30 UTC126
enum FeatureSet {
7ff8adafe9e4atagen2026-10-22 12:30 UTC127
    NoEncryption,
7ff8adafe9e4atagen2026-10-22 12:30 UTC128
    NoSqlite,
7ff8adafe9e4atagen2026-10-22 12:30 UTC129
    NoEncryptionAndSqlite,
7ff8adafe9e4atagen2026-10-22 12:30 UTC130
    SqliteCryptostore,
7ff8adafe9e4atagen2026-10-22 12:30 UTC131
    ExperimentalEncryptedStateEvents,
7ff8adafe9e4atagen2026-10-22 12:30 UTC132
    Markdown,
7ff8adafe9e4atagen2026-10-22 12:30 UTC133
    Socks,
7ff8adafe9e4atagen2026-10-22 12:30 UTC134
    SsoLogin,
7ff8adafe9e4atagen2026-10-22 12:30 UTC135
    Search,
7ff8adafe9e4atagen2026-10-22 12:30 UTC136
    ElementRecentEmojis,
7ff8adafe9e4atagen2026-10-22 12:30 UTC137
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC138
7ff8adafe9e4atagen2026-10-22 12:30 UTC139
#[derive(Subcommand, PartialEq, Eq, PartialOrd, Ord)]
7ff8adafe9e4atagen2026-10-22 12:30 UTC140
#[allow(clippy::enum_variant_names)]
7ff8adafe9e4atagen2026-10-22 12:30 UTC141
enum WasmFeatureSet {
7ff8adafe9e4atagen2026-10-22 12:30 UTC142
    /// Check `matrix-sdk-qrcode` crate
7ff8adafe9e4atagen2026-10-22 12:30 UTC143
    MatrixSdkQrcode,
7ff8adafe9e4atagen2026-10-22 12:30 UTC144
    /// Check `matrix-sdk-base` crate
7ff8adafe9e4atagen2026-10-22 12:30 UTC145
    MatrixSdkBase,
7ff8adafe9e4atagen2026-10-22 12:30 UTC146
    /// Check `matrix-sdk-common` crate
7ff8adafe9e4atagen2026-10-22 12:30 UTC147
    MatrixSdkCommon,
7ff8adafe9e4atagen2026-10-22 12:30 UTC148
    /// Check `matrix-sdk` crate with no default features
7ff8adafe9e4atagen2026-10-22 12:30 UTC149
    MatrixSdkNoDefault,
7ff8adafe9e4atagen2026-10-22 12:30 UTC150
    /// Check `matrix-sdk-ui` crate
7ff8adafe9e4atagen2026-10-22 12:30 UTC151
    MatrixSdkUi,
7ff8adafe9e4atagen2026-10-22 12:30 UTC152
    /// Check `matrix-sdk` crate with `indexeddb` feature (but not
7ff8adafe9e4atagen2026-10-22 12:30 UTC153
    /// `e2e-encryption`)
7ff8adafe9e4atagen2026-10-22 12:30 UTC154
    MatrixSdkIndexeddbStoresNoCrypto,
7ff8adafe9e4atagen2026-10-22 12:30 UTC155
    /// Check `matrix-sdk` crate with `indexeddb` and `e2e-encryption` features
7ff8adafe9e4atagen2026-10-22 12:30 UTC156
    MatrixSdkIndexeddbStores,
7ff8adafe9e4atagen2026-10-22 12:30 UTC157
    /// Check `matrix-sdk-indexeddb` crate with all features
7ff8adafe9e4atagen2026-10-22 12:30 UTC158
    IndexeddbAllFeatures,
7ff8adafe9e4atagen2026-10-22 12:30 UTC159
    /// Check `matrix-sdk-indexeddb` crate with `e2e-encryption` feature
7ff8adafe9e4atagen2026-10-22 12:30 UTC160
    IndexeddbCrypto,
7ff8adafe9e4atagen2026-10-22 12:30 UTC161
    /// Check `matrix-sdk-indexeddb` crate with `state-store` feature
7ff8adafe9e4atagen2026-10-22 12:30 UTC162
    IndexeddbState,
7ff8adafe9e4atagen2026-10-22 12:30 UTC163
    /// Equivalent to `indexeddb-all-features`, `indexeddb-crypto` and
7ff8adafe9e4atagen2026-10-22 12:30 UTC164
    /// `indexeddb-state`
7ff8adafe9e4atagen2026-10-22 12:30 UTC165
    Indexeddb,
7ff8adafe9e4atagen2026-10-22 12:30 UTC166
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC167
7ff8adafe9e4atagen2026-10-22 12:30 UTC168
impl CiArgs {
7ff8adafe9e4atagen2026-10-22 12:30 UTC169
    pub fn run(self) -> Result<()> {
7ff8adafe9e4atagen2026-10-22 12:30 UTC170
        let sh = sh();
7ff8adafe9e4atagen2026-10-22 12:30 UTC171
        let _p = sh.push_dir(workspace::root_path()?);
7ff8adafe9e4atagen2026-10-22 12:30 UTC172
7ff8adafe9e4atagen2026-10-22 12:30 UTC173
        match self.cmd {
7ff8adafe9e4atagen2026-10-22 12:30 UTC174
            Some(cmd) => match cmd {
7ff8adafe9e4atagen2026-10-22 12:30 UTC175
                CiCommand::Style => check_style(),
7ff8adafe9e4atagen2026-10-22 12:30 UTC176
                CiCommand::Typos => check_typos(),
7ff8adafe9e4atagen2026-10-22 12:30 UTC177
                CiCommand::Clippy => check_clippy(),
7ff8adafe9e4atagen2026-10-22 12:30 UTC178
                CiCommand::Docs => check_docs(),
7ff8adafe9e4atagen2026-10-22 12:30 UTC179
                CiCommand::TestFeatures { cmd } => run_feature_tests(cmd),
7ff8adafe9e4atagen2026-10-22 12:30 UTC180
                CiCommand::Wasm { cmd } => run_wasm_checks(cmd),
7ff8adafe9e4atagen2026-10-22 12:30 UTC181
                CiCommand::WasmPack { cmd, runner } => run_wasm_pack_tests(cmd, runner),
7ff8adafe9e4atagen2026-10-22 12:30 UTC182
                CiCommand::TestCrypto => run_crypto_tests(),
7ff8adafe9e4atagen2026-10-22 12:30 UTC183
                CiCommand::Bindings => check_bindings(),
7ff8adafe9e4atagen2026-10-22 12:30 UTC184
                CiCommand::Examples => check_examples(),
7ff8adafe9e4atagen2026-10-22 12:30 UTC185
                CiCommand::Coverage { output_format } => run_coverage(output_format),
7ff8adafe9e4atagen2026-10-22 12:30 UTC186
            },
7ff8adafe9e4atagen2026-10-22 12:30 UTC187
            None => {
7ff8adafe9e4atagen2026-10-22 12:30 UTC188
                check_style()?;
7ff8adafe9e4atagen2026-10-22 12:30 UTC189
                check_clippy()?;
7ff8adafe9e4atagen2026-10-22 12:30 UTC190
                check_typos()?;
7ff8adafe9e4atagen2026-10-22 12:30 UTC191
                check_docs()?;
7ff8adafe9e4atagen2026-10-22 12:30 UTC192
                run_feature_tests(None)?;
7ff8adafe9e4atagen2026-10-22 12:30 UTC193
                run_wasm_checks(None)?;
7ff8adafe9e4atagen2026-10-22 12:30 UTC194
                run_crypto_tests()?;
7ff8adafe9e4atagen2026-10-22 12:30 UTC195
                check_examples()?;
7ff8adafe9e4atagen2026-10-22 12:30 UTC196
7ff8adafe9e4atagen2026-10-22 12:30 UTC197
                Ok(())
7ff8adafe9e4atagen2026-10-22 12:30 UTC198
            }
7ff8adafe9e4atagen2026-10-22 12:30 UTC199
        }
7ff8adafe9e4atagen2026-10-22 12:30 UTC200
    }
7ff8adafe9e4atagen2026-10-22 12:30 UTC201
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC202
7ff8adafe9e4atagen2026-10-22 12:30 UTC203
fn check_bindings() -> Result<()> {
7ff8adafe9e4atagen2026-10-22 12:30 UTC204
    let sh = sh();
7ff8adafe9e4atagen2026-10-22 12:30 UTC205
    cmd!(sh, "rustup run stable cargo build -p matrix-sdk-crypto-ffi -p matrix-sdk-ffi --features sentry,experimental-element-recent-emojis").run()?;
7ff8adafe9e4atagen2026-10-22 12:30 UTC206
    cmd!(
7ff8adafe9e4atagen2026-10-22 12:30 UTC207
        sh,
7ff8adafe9e4atagen2026-10-22 12:30 UTC208
        "
7ff8adafe9e4atagen2026-10-22 12:30 UTC209
        rustup run stable cargo run -p uniffi-bindgen -- generate
7ff8adafe9e4atagen2026-10-22 12:30 UTC210
            --library
7ff8adafe9e4atagen2026-10-22 12:30 UTC211
            --language kotlin
7ff8adafe9e4atagen2026-10-22 12:30 UTC212
            --language swift
7ff8adafe9e4atagen2026-10-22 12:30 UTC213
            --out-dir target/generated-bindings
7ff8adafe9e4atagen2026-10-22 12:30 UTC214
            target/debug/{DLL_PREFIX}matrix_sdk_ffi{DLL_SUFFIX}
7ff8adafe9e4atagen2026-10-22 12:30 UTC215
        "
7ff8adafe9e4atagen2026-10-22 12:30 UTC216
    )
7ff8adafe9e4atagen2026-10-22 12:30 UTC217
    .run()?;
7ff8adafe9e4atagen2026-10-22 12:30 UTC218
    cmd!(
7ff8adafe9e4atagen2026-10-22 12:30 UTC219
        sh,
7ff8adafe9e4atagen2026-10-22 12:30 UTC220
        "
7ff8adafe9e4atagen2026-10-22 12:30 UTC221
        rustup run stable cargo run -p uniffi-bindgen -- generate
7ff8adafe9e4atagen2026-10-22 12:30 UTC222
            --library
7ff8adafe9e4atagen2026-10-22 12:30 UTC223
            --language kotlin
7ff8adafe9e4atagen2026-10-22 12:30 UTC224
            --language swift
7ff8adafe9e4atagen2026-10-22 12:30 UTC225
            --out-dir target/generated-bindings
7ff8adafe9e4atagen2026-10-22 12:30 UTC226
            target/debug/{DLL_PREFIX}matrix_sdk_crypto_ffi{DLL_SUFFIX}
7ff8adafe9e4atagen2026-10-22 12:30 UTC227
        "
7ff8adafe9e4atagen2026-10-22 12:30 UTC228
    )
7ff8adafe9e4atagen2026-10-22 12:30 UTC229
    .run()?;
7ff8adafe9e4atagen2026-10-22 12:30 UTC230
7ff8adafe9e4atagen2026-10-22 12:30 UTC231
    Ok(())
7ff8adafe9e4atagen2026-10-22 12:30 UTC232
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC233
7ff8adafe9e4atagen2026-10-22 12:30 UTC234
fn check_examples() -> Result<()> {
7ff8adafe9e4atagen2026-10-22 12:30 UTC235
    let sh = sh();
7ff8adafe9e4atagen2026-10-22 12:30 UTC236
    cmd!(sh, "rustup run stable cargo check -p example-*").run()?;
7ff8adafe9e4atagen2026-10-22 12:30 UTC237
    Ok(())
7ff8adafe9e4atagen2026-10-22 12:30 UTC238
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC239
7ff8adafe9e4atagen2026-10-22 12:30 UTC240
fn check_style() -> Result<()> {
7ff8adafe9e4atagen2026-10-22 12:30 UTC241
    let sh = sh();
7ff8adafe9e4atagen2026-10-22 12:30 UTC242
    cmd!(sh, "rustup run {NIGHTLY} cargo fmt -- --check").run()?;
7ff8adafe9e4atagen2026-10-22 12:30 UTC243
    Ok(())
7ff8adafe9e4atagen2026-10-22 12:30 UTC244
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC245
7ff8adafe9e4atagen2026-10-22 12:30 UTC246
fn check_typos() -> Result<()> {
7ff8adafe9e4atagen2026-10-22 12:30 UTC247
    let sh = sh();
7ff8adafe9e4atagen2026-10-22 12:30 UTC248
    // FIXME: Print install instructions if command-not-found (needs an xshell
7ff8adafe9e4atagen2026-10-22 12:30 UTC249
    //        change: https://github.com/matklad/xshell/issues/46)
7ff8adafe9e4atagen2026-10-22 12:30 UTC250
    cmd!(sh, "typos").run()?;
7ff8adafe9e4atagen2026-10-22 12:30 UTC251
    Ok(())
7ff8adafe9e4atagen2026-10-22 12:30 UTC252
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC253
7ff8adafe9e4atagen2026-10-22 12:30 UTC254
fn check_clippy() -> Result<()> {
7ff8adafe9e4atagen2026-10-22 12:30 UTC255
    let sh = sh();
7ff8adafe9e4atagen2026-10-22 12:30 UTC256
    cmd!(sh, "rustup run {NIGHTLY} cargo clippy --all-targets --features testing -- -D warnings")
7ff8adafe9e4atagen2026-10-22 12:30 UTC257
        .run()?;
7ff8adafe9e4atagen2026-10-22 12:30 UTC258
7ff8adafe9e4atagen2026-10-22 12:30 UTC259
    cmd!(
7ff8adafe9e4atagen2026-10-22 12:30 UTC260
        sh,
7ff8adafe9e4atagen2026-10-22 12:30 UTC261
        "rustup run {NIGHTLY} cargo clippy --workspace --all-targets
7ff8adafe9e4atagen2026-10-22 12:30 UTC262
            --exclude matrix-sdk-crypto --exclude xtask
7ff8adafe9e4atagen2026-10-22 12:30 UTC263
            --no-default-features
7ff8adafe9e4atagen2026-10-22 12:30 UTC264
            --features sso-login,sqlite,testing,experimental-element-recent-emojis
7ff8adafe9e4atagen2026-10-22 12:30 UTC265
            -- -D warnings"
7ff8adafe9e4atagen2026-10-22 12:30 UTC266
    )
7ff8adafe9e4atagen2026-10-22 12:30 UTC267
    .run()?;
7ff8adafe9e4atagen2026-10-22 12:30 UTC268
7ff8adafe9e4atagen2026-10-22 12:30 UTC269
    cmd!(
7ff8adafe9e4atagen2026-10-22 12:30 UTC270
        sh,
7ff8adafe9e4atagen2026-10-22 12:30 UTC271
        "rustup run {NIGHTLY} cargo clippy --all-targets -p matrix-sdk-crypto
7ff8adafe9e4atagen2026-10-22 12:30 UTC272
            --no-default-features -- -D warnings"
7ff8adafe9e4atagen2026-10-22 12:30 UTC273
    )
7ff8adafe9e4atagen2026-10-22 12:30 UTC274
    .run()?;
7ff8adafe9e4atagen2026-10-22 12:30 UTC275
7ff8adafe9e4atagen2026-10-22 12:30 UTC276
    Ok(())
7ff8adafe9e4atagen2026-10-22 12:30 UTC277
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC278
7ff8adafe9e4atagen2026-10-22 12:30 UTC279
fn check_docs() -> Result<()> {
7ff8adafe9e4atagen2026-10-22 12:30 UTC280
    build_docs([], DenyWarnings::Yes)
7ff8adafe9e4atagen2026-10-22 12:30 UTC281
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC282
7ff8adafe9e4atagen2026-10-22 12:30 UTC283
fn run_feature_tests(cmd: Option<FeatureSet>) -> Result<()> {
7ff8adafe9e4atagen2026-10-22 12:30 UTC284
    let args = BTreeMap::from([
7ff8adafe9e4atagen2026-10-22 12:30 UTC285
        (FeatureSet::NoEncryption, "--no-default-features --features sqlite,testing"),
7ff8adafe9e4atagen2026-10-22 12:30 UTC286
        (FeatureSet::NoSqlite, "--no-default-features --features e2e-encryption,testing"),
7ff8adafe9e4atagen2026-10-22 12:30 UTC287
        (FeatureSet::NoEncryptionAndSqlite, "--no-default-features --features testing"),
7ff8adafe9e4atagen2026-10-22 12:30 UTC288
        (
7ff8adafe9e4atagen2026-10-22 12:30 UTC289
            FeatureSet::SqliteCryptostore,
7ff8adafe9e4atagen2026-10-22 12:30 UTC290
            "--no-default-features --features e2e-encryption,sqlite,testing",
7ff8adafe9e4atagen2026-10-22 12:30 UTC291
        ),
7ff8adafe9e4atagen2026-10-22 12:30 UTC292
        (
7ff8adafe9e4atagen2026-10-22 12:30 UTC293
            FeatureSet::ExperimentalEncryptedStateEvents,
7ff8adafe9e4atagen2026-10-22 12:30 UTC294
            "--no-default-features --features experimental-encrypted-state-events,e2e-encryption,sqlite,testing",
7ff8adafe9e4atagen2026-10-22 12:30 UTC295
        ),
7ff8adafe9e4atagen2026-10-22 12:30 UTC296
        (FeatureSet::Markdown, "--features markdown,testing"),
7ff8adafe9e4atagen2026-10-22 12:30 UTC297
        (FeatureSet::Socks, "--features socks,testing"),
7ff8adafe9e4atagen2026-10-22 12:30 UTC298
        (FeatureSet::SsoLogin, "--features sso-login,testing"),
7ff8adafe9e4atagen2026-10-22 12:30 UTC299
        (FeatureSet::Search, "--features experimental-search"),
7ff8adafe9e4atagen2026-10-22 12:30 UTC300
        (FeatureSet::ElementRecentEmojis, "--features experimental-element-recent-emojis"),
7ff8adafe9e4atagen2026-10-22 12:30 UTC301
    ]);
7ff8adafe9e4atagen2026-10-22 12:30 UTC302
7ff8adafe9e4atagen2026-10-22 12:30 UTC303
    let sh = sh();
7ff8adafe9e4atagen2026-10-22 12:30 UTC304
    let run = |arg_set: &str| {
7ff8adafe9e4atagen2026-10-22 12:30 UTC305
        cmd!(sh, "rustup run stable cargo nextest run -p matrix-sdk")
7ff8adafe9e4atagen2026-10-22 12:30 UTC306
            .args(arg_set.split_whitespace())
7ff8adafe9e4atagen2026-10-22 12:30 UTC307
            .run()?;
7ff8adafe9e4atagen2026-10-22 12:30 UTC308
        cmd!(sh, "rustup run stable cargo test --doc -p matrix-sdk")
7ff8adafe9e4atagen2026-10-22 12:30 UTC309
            .args(arg_set.split_whitespace())
7ff8adafe9e4atagen2026-10-22 12:30 UTC310
            .run()
7ff8adafe9e4atagen2026-10-22 12:30 UTC311
    };
7ff8adafe9e4atagen2026-10-22 12:30 UTC312
7ff8adafe9e4atagen2026-10-22 12:30 UTC313
    match cmd {
7ff8adafe9e4atagen2026-10-22 12:30 UTC314
        Some(cmd) => {
7ff8adafe9e4atagen2026-10-22 12:30 UTC315
            run(args[&cmd])?;
7ff8adafe9e4atagen2026-10-22 12:30 UTC316
        }
7ff8adafe9e4atagen2026-10-22 12:30 UTC317
        None => {
7ff8adafe9e4atagen2026-10-22 12:30 UTC318
            for &arg_set in args.values() {
7ff8adafe9e4atagen2026-10-22 12:30 UTC319
                run(arg_set)?;
7ff8adafe9e4atagen2026-10-22 12:30 UTC320
            }
7ff8adafe9e4atagen2026-10-22 12:30 UTC321
        }
7ff8adafe9e4atagen2026-10-22 12:30 UTC322
    }
7ff8adafe9e4atagen2026-10-22 12:30 UTC323
7ff8adafe9e4atagen2026-10-22 12:30 UTC324
    Ok(())
7ff8adafe9e4atagen2026-10-22 12:30 UTC325
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC326
7ff8adafe9e4atagen2026-10-22 12:30 UTC327
fn run_crypto_tests() -> Result<()> {
7ff8adafe9e4atagen2026-10-22 12:30 UTC328
    let sh = sh();
7ff8adafe9e4atagen2026-10-22 12:30 UTC329
    cmd!(sh, "rustup run stable cargo clippy -p matrix-sdk-crypto -- -D warnings").run()?;
7ff8adafe9e4atagen2026-10-22 12:30 UTC330
    cmd!(sh, "rustup run stable cargo nextest run -p matrix-sdk-crypto --no-default-features --features testing").run()?;
7ff8adafe9e4atagen2026-10-22 12:30 UTC331
    cmd!(sh, "rustup run stable cargo nextest run -p matrix-sdk-crypto --features=testing")
7ff8adafe9e4atagen2026-10-22 12:30 UTC332
        .run()?;
7ff8adafe9e4atagen2026-10-22 12:30 UTC333
    cmd!(sh, "rustup run stable cargo test --doc -p matrix-sdk-crypto --features=testing").run()?;
7ff8adafe9e4atagen2026-10-22 12:30 UTC334
    cmd!(
7ff8adafe9e4atagen2026-10-22 12:30 UTC335
        sh,
7ff8adafe9e4atagen2026-10-22 12:30 UTC336
        "rustup run stable cargo clippy -p matrix-sdk-crypto --features=experimental-algorithms -- -D warnings"
7ff8adafe9e4atagen2026-10-22 12:30 UTC337
    )
7ff8adafe9e4atagen2026-10-22 12:30 UTC338
    .run()?;
7ff8adafe9e4atagen2026-10-22 12:30 UTC339
    cmd!(
7ff8adafe9e4atagen2026-10-22 12:30 UTC340
        sh,
7ff8adafe9e4atagen2026-10-22 12:30 UTC341
        "rustup run stable cargo nextest run -p matrix-sdk-crypto --features=experimental-algorithms,testing"
7ff8adafe9e4atagen2026-10-22 12:30 UTC342
    ).run()?;
7ff8adafe9e4atagen2026-10-22 12:30 UTC343
    cmd!(
7ff8adafe9e4atagen2026-10-22 12:30 UTC344
        sh,
7ff8adafe9e4atagen2026-10-22 12:30 UTC345
        "rustup run stable cargo test --doc -p matrix-sdk-crypto --features=experimental-algorithms,testing"
7ff8adafe9e4atagen2026-10-22 12:30 UTC346
    )
7ff8adafe9e4atagen2026-10-22 12:30 UTC347
    .run()?;
7ff8adafe9e4atagen2026-10-22 12:30 UTC348
    cmd!(sh, "rustup run stable cargo nextest run -p matrix-sdk-crypto --features=experimental-encrypted-state-events").run()?;
7ff8adafe9e4atagen2026-10-22 12:30 UTC349
7ff8adafe9e4atagen2026-10-22 12:30 UTC350
    cmd!(sh, "rustup run stable cargo nextest run -p matrix-sdk-crypto-ffi").run()?;
7ff8adafe9e4atagen2026-10-22 12:30 UTC351
7ff8adafe9e4atagen2026-10-22 12:30 UTC352
    cmd!(
7ff8adafe9e4atagen2026-10-22 12:30 UTC353
        sh,
7ff8adafe9e4atagen2026-10-22 12:30 UTC354
        "rustup run stable cargo nextest run -p matrix-sdk-sqlite --features crypto-store,testing"
7ff8adafe9e4atagen2026-10-22 12:30 UTC355
    )
7ff8adafe9e4atagen2026-10-22 12:30 UTC356
    .run()?;
7ff8adafe9e4atagen2026-10-22 12:30 UTC357
7ff8adafe9e4atagen2026-10-22 12:30 UTC358
    Ok(())
7ff8adafe9e4atagen2026-10-22 12:30 UTC359
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC360
7ff8adafe9e4atagen2026-10-22 12:30 UTC361
fn run_wasm_checks(cmd: Option<WasmFeatureSet>) -> Result<()> {
7ff8adafe9e4atagen2026-10-22 12:30 UTC362
    if let Some(WasmFeatureSet::Indexeddb) = cmd {
7ff8adafe9e4atagen2026-10-22 12:30 UTC363
        run_wasm_checks(Some(WasmFeatureSet::IndexeddbAllFeatures))?;
7ff8adafe9e4atagen2026-10-22 12:30 UTC364
        run_wasm_checks(Some(WasmFeatureSet::IndexeddbCrypto))?;
7ff8adafe9e4atagen2026-10-22 12:30 UTC365
        run_wasm_checks(Some(WasmFeatureSet::IndexeddbState))?;
7ff8adafe9e4atagen2026-10-22 12:30 UTC366
        return Ok(());
7ff8adafe9e4atagen2026-10-22 12:30 UTC367
    }
7ff8adafe9e4atagen2026-10-22 12:30 UTC368
7ff8adafe9e4atagen2026-10-22 12:30 UTC369
    let args = BTreeMap::from([
7ff8adafe9e4atagen2026-10-22 12:30 UTC370
        (WasmFeatureSet::MatrixSdkQrcode, "-p matrix-sdk-qrcode --features js"),
7ff8adafe9e4atagen2026-10-22 12:30 UTC371
        (WasmFeatureSet::MatrixSdkNoDefault, "-p matrix-sdk --no-default-features --features js"),
7ff8adafe9e4atagen2026-10-22 12:30 UTC372
        (WasmFeatureSet::MatrixSdkBase, "-p matrix-sdk-base --features js,test-send-sync"),
7ff8adafe9e4atagen2026-10-22 12:30 UTC373
        (WasmFeatureSet::MatrixSdkCommon, "-p matrix-sdk-common --features js"),
7ff8adafe9e4atagen2026-10-22 12:30 UTC374
        (WasmFeatureSet::MatrixSdkUi, "-p matrix-sdk-ui --features js"),
7ff8adafe9e4atagen2026-10-22 12:30 UTC375
        (
7ff8adafe9e4atagen2026-10-22 12:30 UTC376
            WasmFeatureSet::MatrixSdkIndexeddbStoresNoCrypto,
7ff8adafe9e4atagen2026-10-22 12:30 UTC377
            "-p matrix-sdk --no-default-features --features js,indexeddb",
7ff8adafe9e4atagen2026-10-22 12:30 UTC378
        ),
7ff8adafe9e4atagen2026-10-22 12:30 UTC379
        (
7ff8adafe9e4atagen2026-10-22 12:30 UTC380
            WasmFeatureSet::MatrixSdkIndexeddbStores,
7ff8adafe9e4atagen2026-10-22 12:30 UTC381
            "-p matrix-sdk --no-default-features --features js,indexeddb,e2e-encryption",
7ff8adafe9e4atagen2026-10-22 12:30 UTC382
        ),
7ff8adafe9e4atagen2026-10-22 12:30 UTC383
        (WasmFeatureSet::IndexeddbAllFeatures, "-p matrix-sdk-indexeddb"),
7ff8adafe9e4atagen2026-10-22 12:30 UTC384
        (
7ff8adafe9e4atagen2026-10-22 12:30 UTC385
            WasmFeatureSet::IndexeddbCrypto,
7ff8adafe9e4atagen2026-10-22 12:30 UTC386
            "-p matrix-sdk-indexeddb --no-default-features --features e2e-encryption",
7ff8adafe9e4atagen2026-10-22 12:30 UTC387
        ),
7ff8adafe9e4atagen2026-10-22 12:30 UTC388
        (
7ff8adafe9e4atagen2026-10-22 12:30 UTC389
            WasmFeatureSet::IndexeddbState,
7ff8adafe9e4atagen2026-10-22 12:30 UTC390
            "-p matrix-sdk-indexeddb --no-default-features --features state-store",
7ff8adafe9e4atagen2026-10-22 12:30 UTC391
        ),
7ff8adafe9e4atagen2026-10-22 12:30 UTC392
    ]);
7ff8adafe9e4atagen2026-10-22 12:30 UTC393
7ff8adafe9e4atagen2026-10-22 12:30 UTC394
    let sh = sh();
7ff8adafe9e4atagen2026-10-22 12:30 UTC395
    let run = |arg_set: &str| {
7ff8adafe9e4atagen2026-10-22 12:30 UTC396
        cmd!(sh, "rustup run stable cargo clippy --target wasm32-unknown-unknown")
7ff8adafe9e4atagen2026-10-22 12:30 UTC397
            .args(arg_set.split_whitespace())
7ff8adafe9e4atagen2026-10-22 12:30 UTC398
            .args(["--", "-D", "warnings"])
7ff8adafe9e4atagen2026-10-22 12:30 UTC399
            .env(WASM_TIMEOUT_ENV_KEY, WASM_TIMEOUT_VALUE)
7ff8adafe9e4atagen2026-10-22 12:30 UTC400
            .run()
7ff8adafe9e4atagen2026-10-22 12:30 UTC401
    };
7ff8adafe9e4atagen2026-10-22 12:30 UTC402
7ff8adafe9e4atagen2026-10-22 12:30 UTC403
    match cmd {
7ff8adafe9e4atagen2026-10-22 12:30 UTC404
        Some(cmd) => {
7ff8adafe9e4atagen2026-10-22 12:30 UTC405
            run(args[&cmd])?;
7ff8adafe9e4atagen2026-10-22 12:30 UTC406
        }
7ff8adafe9e4atagen2026-10-22 12:30 UTC407
        None => {
7ff8adafe9e4atagen2026-10-22 12:30 UTC408
            for &arg_set in args.values() {
7ff8adafe9e4atagen2026-10-22 12:30 UTC409
                run(arg_set)?;
7ff8adafe9e4atagen2026-10-22 12:30 UTC410
            }
7ff8adafe9e4atagen2026-10-22 12:30 UTC411
        }
7ff8adafe9e4atagen2026-10-22 12:30 UTC412
    }
7ff8adafe9e4atagen2026-10-22 12:30 UTC413
7ff8adafe9e4atagen2026-10-22 12:30 UTC414
    Ok(())
7ff8adafe9e4atagen2026-10-22 12:30 UTC415
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC416
7ff8adafe9e4atagen2026-10-22 12:30 UTC417
fn run_wasm_pack_tests(cmd: Option<WasmFeatureSet>, runner: WasmTestRunner) -> Result<()> {
7ff8adafe9e4atagen2026-10-22 12:30 UTC418
    if let Some(WasmFeatureSet::Indexeddb) = cmd {
7ff8adafe9e4atagen2026-10-22 12:30 UTC419
        run_wasm_pack_tests(Some(WasmFeatureSet::IndexeddbAllFeatures), runner)?;
7ff8adafe9e4atagen2026-10-22 12:30 UTC420
        run_wasm_pack_tests(Some(WasmFeatureSet::IndexeddbCrypto), runner)?;
7ff8adafe9e4atagen2026-10-22 12:30 UTC421
        run_wasm_pack_tests(Some(WasmFeatureSet::IndexeddbState), runner)?;
7ff8adafe9e4atagen2026-10-22 12:30 UTC422
        return Ok(());
7ff8adafe9e4atagen2026-10-22 12:30 UTC423
    }
7ff8adafe9e4atagen2026-10-22 12:30 UTC424
7ff8adafe9e4atagen2026-10-22 12:30 UTC425
    let args = BTreeMap::from([
7ff8adafe9e4atagen2026-10-22 12:30 UTC426
        (WasmFeatureSet::MatrixSdkQrcode, ("crates/matrix-sdk-qrcode", "--features js")),
7ff8adafe9e4atagen2026-10-22 12:30 UTC427
        (
7ff8adafe9e4atagen2026-10-22 12:30 UTC428
            WasmFeatureSet::MatrixSdkNoDefault,
7ff8adafe9e4atagen2026-10-22 12:30 UTC429
            ("crates/matrix-sdk", "--no-default-features --features js --lib"),
7ff8adafe9e4atagen2026-10-22 12:30 UTC430
        ),
7ff8adafe9e4atagen2026-10-22 12:30 UTC431
        (WasmFeatureSet::MatrixSdkBase, ("crates/matrix-sdk-base", "--features js")),
7ff8adafe9e4atagen2026-10-22 12:30 UTC432
        (WasmFeatureSet::MatrixSdkCommon, ("crates/matrix-sdk-common", "--features js")),
7ff8adafe9e4atagen2026-10-22 12:30 UTC433
        (
7ff8adafe9e4atagen2026-10-22 12:30 UTC434
            WasmFeatureSet::MatrixSdkIndexeddbStoresNoCrypto,
7ff8adafe9e4atagen2026-10-22 12:30 UTC435
            ("crates/matrix-sdk", "--no-default-features --features js,indexeddb --lib"),
7ff8adafe9e4atagen2026-10-22 12:30 UTC436
        ),
7ff8adafe9e4atagen2026-10-22 12:30 UTC437
        (
7ff8adafe9e4atagen2026-10-22 12:30 UTC438
            WasmFeatureSet::MatrixSdkIndexeddbStores,
7ff8adafe9e4atagen2026-10-22 12:30 UTC439
            (
7ff8adafe9e4atagen2026-10-22 12:30 UTC440
                "crates/matrix-sdk",
7ff8adafe9e4atagen2026-10-22 12:30 UTC441
                "--no-default-features --features js,indexeddb,e2e-encryption,testing --lib",
7ff8adafe9e4atagen2026-10-22 12:30 UTC442
            ),
7ff8adafe9e4atagen2026-10-22 12:30 UTC443
        ),
7ff8adafe9e4atagen2026-10-22 12:30 UTC444
        (WasmFeatureSet::IndexeddbAllFeatures, ("crates/matrix-sdk-indexeddb", "")),
7ff8adafe9e4atagen2026-10-22 12:30 UTC445
        (
7ff8adafe9e4atagen2026-10-22 12:30 UTC446
            WasmFeatureSet::IndexeddbCrypto,
7ff8adafe9e4atagen2026-10-22 12:30 UTC447
            ("crates/matrix-sdk-indexeddb", "--no-default-features --features e2e-encryption"),
7ff8adafe9e4atagen2026-10-22 12:30 UTC448
        ),
7ff8adafe9e4atagen2026-10-22 12:30 UTC449
        (
7ff8adafe9e4atagen2026-10-22 12:30 UTC450
            WasmFeatureSet::IndexeddbState,
7ff8adafe9e4atagen2026-10-22 12:30 UTC451
            ("crates/matrix-sdk-indexeddb", "--no-default-features --features state-store"),
7ff8adafe9e4atagen2026-10-22 12:30 UTC452
        ),
7ff8adafe9e4atagen2026-10-22 12:30 UTC453
    ]);
7ff8adafe9e4atagen2026-10-22 12:30 UTC454
7ff8adafe9e4atagen2026-10-22 12:30 UTC455
    let sh = sh();
7ff8adafe9e4atagen2026-10-22 12:30 UTC456
    let run = |runner: WasmTestRunner, (folder, arg_set): (&str, &str)| {
7ff8adafe9e4atagen2026-10-22 12:30 UTC457
        let _pwd = sh.push_dir(folder);
7ff8adafe9e4atagen2026-10-22 12:30 UTC458
7ff8adafe9e4atagen2026-10-22 12:30 UTC459
        cmd!(sh, "pwd").run()?; // print dir so we know what might have failed
7ff8adafe9e4atagen2026-10-22 12:30 UTC460
7ff8adafe9e4atagen2026-10-22 12:30 UTC461
        if matches!(runner, WasmTestRunner::All | WasmTestRunner::Node) {
7ff8adafe9e4atagen2026-10-22 12:30 UTC462
            cmd!(sh, "wasm-pack test --node -- ")
7ff8adafe9e4atagen2026-10-22 12:30 UTC463
                .args(arg_set.split_whitespace())
7ff8adafe9e4atagen2026-10-22 12:30 UTC464
                .env(WASM_TIMEOUT_ENV_KEY, WASM_TIMEOUT_VALUE)
7ff8adafe9e4atagen2026-10-22 12:30 UTC465
                .run()?;
7ff8adafe9e4atagen2026-10-22 12:30 UTC466
        }
7ff8adafe9e4atagen2026-10-22 12:30 UTC467
7ff8adafe9e4atagen2026-10-22 12:30 UTC468
        if matches!(runner, WasmTestRunner::All | WasmTestRunner::Firefox) {
7ff8adafe9e4atagen2026-10-22 12:30 UTC469
            cmd!(sh, "wasm-pack test --firefox --headless --")
7ff8adafe9e4atagen2026-10-22 12:30 UTC470
                .args(arg_set.split_whitespace())
7ff8adafe9e4atagen2026-10-22 12:30 UTC471
                .env(WASM_TIMEOUT_ENV_KEY, WASM_TIMEOUT_VALUE)
7ff8adafe9e4atagen2026-10-22 12:30 UTC472
                .run()?;
7ff8adafe9e4atagen2026-10-22 12:30 UTC473
        }
7ff8adafe9e4atagen2026-10-22 12:30 UTC474
7ff8adafe9e4atagen2026-10-22 12:30 UTC475
        if matches!(runner, WasmTestRunner::All | WasmTestRunner::Chrome) {
7ff8adafe9e4atagen2026-10-22 12:30 UTC476
            cmd!(sh, "wasm-pack test --chrome --headless --")
7ff8adafe9e4atagen2026-10-22 12:30 UTC477
                .args(arg_set.split_whitespace())
7ff8adafe9e4atagen2026-10-22 12:30 UTC478
                .env(WASM_TIMEOUT_ENV_KEY, WASM_TIMEOUT_VALUE)
7ff8adafe9e4atagen2026-10-22 12:30 UTC479
                .run()?;
7ff8adafe9e4atagen2026-10-22 12:30 UTC480
        }
7ff8adafe9e4atagen2026-10-22 12:30 UTC481
7ff8adafe9e4atagen2026-10-22 12:30 UTC482
        Ok::<_, xshell::Error>(())
7ff8adafe9e4atagen2026-10-22 12:30 UTC483
    };
7ff8adafe9e4atagen2026-10-22 12:30 UTC484
7ff8adafe9e4atagen2026-10-22 12:30 UTC485
    match cmd {
7ff8adafe9e4atagen2026-10-22 12:30 UTC486
        Some(cmd) => {
7ff8adafe9e4atagen2026-10-22 12:30 UTC487
            run(runner, args[&cmd])?;
7ff8adafe9e4atagen2026-10-22 12:30 UTC488
        }
7ff8adafe9e4atagen2026-10-22 12:30 UTC489
        None => {
7ff8adafe9e4atagen2026-10-22 12:30 UTC490
            for &arg_set in args.values() {
7ff8adafe9e4atagen2026-10-22 12:30 UTC491
                run(runner, arg_set)?;
7ff8adafe9e4atagen2026-10-22 12:30 UTC492
            }
7ff8adafe9e4atagen2026-10-22 12:30 UTC493
        }
7ff8adafe9e4atagen2026-10-22 12:30 UTC494
    }
7ff8adafe9e4atagen2026-10-22 12:30 UTC495
7ff8adafe9e4atagen2026-10-22 12:30 UTC496
    Ok(())
7ff8adafe9e4atagen2026-10-22 12:30 UTC497
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC498
7ff8adafe9e4atagen2026-10-22 12:30 UTC499
fn run_coverage(output_format: CoverageOutputFormat) -> Result<()> {
7ff8adafe9e4atagen2026-10-22 12:30 UTC500
    let sh = sh();
7ff8adafe9e4atagen2026-10-22 12:30 UTC501
    let cmd = cmd!(sh, "rustup run stable cargo llvm-cov nextest");
7ff8adafe9e4atagen2026-10-22 12:30 UTC502
    let cmd = cmd.args([
7ff8adafe9e4atagen2026-10-22 12:30 UTC503
        "--workspace",
7ff8adafe9e4atagen2026-10-22 12:30 UTC504
        "--exclude",
7ff8adafe9e4atagen2026-10-22 12:30 UTC505
        "matrix-sdk-indexeddb",
7ff8adafe9e4atagen2026-10-22 12:30 UTC506
        "--ignore-filename-regex",
7ff8adafe9e4atagen2026-10-22 12:30 UTC507
        "testing/*|bindings/*|uniffi-bindgen|labs/*",
7ff8adafe9e4atagen2026-10-22 12:30 UTC508
    ]);
7ff8adafe9e4atagen2026-10-22 12:30 UTC509
7ff8adafe9e4atagen2026-10-22 12:30 UTC510
    let cmd = match output_format {
7ff8adafe9e4atagen2026-10-22 12:30 UTC511
        CoverageOutputFormat::Text => cmd,
7ff8adafe9e4atagen2026-10-22 12:30 UTC512
        CoverageOutputFormat::Html => cmd.arg("--html"),
7ff8adafe9e4atagen2026-10-22 12:30 UTC513
        CoverageOutputFormat::Codecov => {
7ff8adafe9e4atagen2026-10-22 12:30 UTC514
            cmd.args(["--codecov", "--output-path", "coverage.xml", "--profile", "ci"])
7ff8adafe9e4atagen2026-10-22 12:30 UTC515
        }
7ff8adafe9e4atagen2026-10-22 12:30 UTC516
    };
7ff8adafe9e4atagen2026-10-22 12:30 UTC517
7ff8adafe9e4atagen2026-10-22 12:30 UTC518
    cmd.run()?;
7ff8adafe9e4atagen2026-10-22 12:30 UTC519
7ff8adafe9e4atagen2026-10-22 12:30 UTC520
    Ok(())
7ff8adafe9e4atagen2026-10-22 12:30 UTC521
}