diff --git a/.github/workflows/cont_integration.yml b/.github/workflows/cont_integration.yml index 91496638..727f042b 100644 --- a/.github/workflows/cont_integration.yml +++ b/.github/workflows/cont_integration.yml @@ -2,6 +2,10 @@ on: [push, pull_request] name: CI +permissions: + contents: read +env: + CARGO_TERM_COLOR: always jobs: build-test: @@ -17,30 +21,41 @@ jobs: - --all-features steps: - name: Checkout - uses: actions/checkout@v4 - - name: Generate cache key - run: echo "${{ matrix.rust }} ${{ matrix.features }}" | tee .cache_key - - name: Cache - uses: actions/cache@v4 - with: - path: | - ~/.cargo/registry - ~/.cargo/git - target - key: ${{ runner.os }}-cargo-${{ hashFiles('.cache_key') }}-${{ hashFiles('**/Cargo.toml','**/Cargo.lock') }} + uses: actions/checkout@v6 - name: Setup Rust Toolchain - uses: actions-rs/toolchain@v1 + uses: actions-rust-lang/setup-rust-toolchain@v1 with: toolchain: ${{ matrix.rust }} profile: minimal override: true components: rustfmt, clippy + cache: true - name: Build run: cargo build ${{ matrix.features }} - - name: Clippy - run: cargo clippy -- -D warnings - name: Test run: cargo test ${{ matrix.features }} + clippy: + name: Clippy (${{ matrix.features }}) + runs-on: ubuntu-latest + strategy: + matrix: + features: + - --no-default-features + - --all-features + steps: + - name: Checkout + uses: actions/checkout@v6 + + - name: Install Rust toolchain + uses: actions-rust-lang/setup-rust-toolchain@v1 + with: + toolchain: stable + profile: minimal + override: true + components: clippy + cache: true + - name: Run Clippy + run: cargo clippy ${{ matrix.features }} --all-targets -- -D warnings # TODO: fix or remove this # wasm-build: @@ -82,13 +97,14 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Setup Rust Toolchain - uses: actions-rs/toolchain@v1 + uses: actions-rust-lang/setup-rust-toolchain@v1 with: toolchain: stable profile: minimal override: true components: rustfmt, clippy + cache: true - name: Check fmt run: cargo fmt --all -- --check diff --git a/Justfile b/Justfile index 013c4076..06296819 100644 --- a/Justfile +++ b/Justfile @@ -25,6 +25,18 @@ build: fmt test: cargo test --all-features --tests +# checks before pushing +pre-push: + cargo build --features default + cargo test --features default + cargo build --no-default-features + cargo test --no-default-features + cargo build --all-features + cargo test --all-features + cargo clippy --no-default-features --all-targets -- -D warnings + cargo clippy --all-features --all-targets -- -D warnings + cargo fmt --all -- --check + # clean the project target directory clean: cargo clean @@ -99,4 +111,4 @@ descriptors private wallet=default_wallet: # run any bitcoin-cli rpc command [group('rpc')] rpc command wallet=default_wallet: - bitcoin-cli -datadir={{default_datadir}} -regtest -rpcwallet={{wallet}} -rpcuser={{rpc_user}} -rpcpassword={{rpc_password}} {{command}} \ No newline at end of file + bitcoin-cli -datadir={{default_datadir}} -regtest -rpcwallet={{wallet}} -rpcuser={{rpc_user}} -rpcpassword={{rpc_password}} {{command}} diff --git a/src/error.rs b/src/error.rs index 064a928d..0a50347e 100644 --- a/src/error.rs +++ b/src/error.rs @@ -59,15 +59,15 @@ pub enum BDKCliError { #[cfg(feature = "sqlite")] #[error("Rusqlite error: {0}")] - RusqliteError(#[from] bdk_wallet::rusqlite::Error), + RusqliteError(Box), #[cfg(feature = "redb")] #[error("Redb StoreError: {0}")] - RedbStoreError(#[from] bdk_redb::error::StoreError), + RedbStoreError(Box), #[cfg(feature = "redb")] #[error("Redb dabtabase error: {0}")] - RedbDatabaseError(#[from] bdk_redb::redb::DatabaseError), + RedbDatabaseError(Box), #[error("Serde json error: {0}")] SerdeJson(#[from] serde_json::Error), @@ -119,3 +119,24 @@ impl From for BDKCliError { BDKCliError::PsbtExtractTxError(Box::new(value)) } } + +#[cfg(feature = "redb")] +impl From for BDKCliError { + fn from(err: bdk_redb::error::StoreError) -> Self { + BDKCliError::RedbStoreError(Box::new(err)) + } +} + +#[cfg(feature = "redb")] +impl From for BDKCliError { + fn from(err: bdk_redb::redb::DatabaseError) -> Self { + BDKCliError::RedbDatabaseError(Box::new(err)) + } +} + +#[cfg(feature = "sqlite")] +impl From for BDKCliError { + fn from(err: bdk_wallet::rusqlite::Error) -> Self { + BDKCliError::RusqliteError(Box::new(err)) + } +} diff --git a/src/payjoin/mod.rs b/src/payjoin/mod.rs index f5e1274c..38eed7e9 100644 --- a/src/payjoin/mod.rs +++ b/src/payjoin/mod.rs @@ -75,7 +75,7 @@ impl<'a> PayjoinManager<'a> { let persister = payjoin::persist::NoopSessionPersister::::default(); let checked_max_fee_rate = max_fee_rate - .map(|rate| FeeRate::from_sat_per_kwu(rate)) + .map(FeeRate::from_sat_per_kwu) .unwrap_or(FeeRate::BROADCAST_MIN); let receiver = payjoin::receive::v2::ReceiverBuilder::new( @@ -296,7 +296,7 @@ impl<'a> PayjoinManager<'a> { .await } ReceiveSession::HasReplyableError(error) => self.handle_error(error, persister).await, - ReceiveSession::Closed(_) => return Err(Error::Generic("Session closed".to_string())), + ReceiveSession::Closed(_) => Err(Error::Generic("Session closed".to_string())), } } @@ -333,8 +333,7 @@ impl<'a> PayjoinManager<'a> { } Err(e) => { return Err(Error::Generic(format!( - "Error occurred when polling for Payjoin proposal from the directory: {}", - e.to_string() + "Error occurred when polling for Payjoin proposal from the directory: {e}" ))); } } @@ -633,20 +632,24 @@ impl<'a> PayjoinManager<'a> { let check_result = receiver .check_payment( |txid| { - let Some(tx_details) = self.wallet.tx_details(txid) else { - return Err(ImplementationError::from("Cannot find the transaction in the mempool or the blockchain")); - }; + let tx_details = self.wallet.tx_details(txid) + .ok_or(ImplementationError::from( + "Cannot find the transaction in the mempool or the blockchain" + ))?; - let is_seen = match tx_details.chain_position { - bdk_wallet::chain::ChainPosition::Confirmed { .. } => true, - bdk_wallet::chain::ChainPosition::Unconfirmed { first_seen: Some(_), .. } => true, - _ => false - }; + let is_seen = matches!( + tx_details.chain_position, + bdk_wallet::chain::ChainPosition::Confirmed { .. } + | bdk_wallet::chain::ChainPosition::Unconfirmed { first_seen: Some(_), .. } + ); if is_seen { - return Ok(Some(tx_details.tx.as_ref().clone())); + Ok(Some(tx_details.tx.as_ref().clone())) + } else { + Err(ImplementationError::from( + "Cannot find the transaction in the mempool or the blockchain" + )) } - return Err(ImplementationError::from("Cannot find the transaction in the mempool or the blockchain")); }, |outpoint| { let utxo = self.wallet.get_utxo(outpoint);