]> Untitled Git - bdk/commitdiff
Better no-std support
authorSteve Myers <steve@notmandatory.org>
Wed, 15 Mar 2023 16:44:52 +0000 (11:44 -0500)
committerSteve Myers <steve@notmandatory.org>
Tue, 20 Jun 2023 20:53:48 +0000 (15:53 -0500)
- Use `default-features = false` for `miniscript`,`bitcoin`,and `bdk_chain`
- Introduce `bdk_chain/std` feature
- Add GitHub workflow `check-no-std` (not yet completly working)
- Update GitHub workflow `check-wasm` to disable default `std` features

.github/workflows/cont_integration.yml
crates/bdk/Cargo.toml
crates/bdk/src/descriptor/error.rs
crates/bdk/src/error.rs
crates/bdk/src/keys/mod.rs
crates/bdk/src/wallet/mod.rs
crates/chain/Cargo.toml
crates/esplora/Cargo.toml

index 128ba7251f452e12130026037465484ee895e737..e5771dd1c3c35437daf3cd1b2434380536665336 100644 (file)
@@ -32,6 +32,34 @@ jobs:
       - name: Test
         run: cargo test ${{ matrix.features }}
 
+  check-no-std:
+    name: Check no_std
+    runs-on: ubuntu-latest
+    steps:
+      - name: Checkout
+        uses: actions/checkout@v2
+      - name: Install Rust toolchain
+        uses: actions-rs/toolchain@v1
+        with:
+          toolchain: stable
+          override: true
+          profile: minimal
+          # target: "thumbv6m-none-eabi"
+      - name: Rust Cache
+        uses: Swatinem/rust-cache@v2.2.1
+      - name: Check bdk_chain
+        working-directory: ./crates/chain
+        # TODO "--target thumbv6m-none-eabi" should work but currently does not
+        run: cargo check --no-default-features --features bitcoin/no-std,miniscript/no-std,hashbrown
+      - name: Check bdk
+        working-directory: ./crates/bdk
+        # TODO "--target thumbv6m-none-eabi" should work but currently does not
+        run: cargo check --no-default-features --features bitcoin/no-std,miniscript/no-std,bdk_chain/hashbrown
+      - name: Check esplora
+        working-directory: ./crates/esplora
+        # TODO "--target thumbv6m-none-eabi" should work but currently does not
+        run: cargo check --no-default-features --features bitcoin/no-std,miniscript/no-std,bdk_chain/hashbrown
+
   check-wasm:
     name: Check WASM
     runs-on: ubuntu-20.04
@@ -57,10 +85,10 @@ jobs:
         uses: Swatinem/rust-cache@v2.2.1
       - name: Check bdk
         working-directory: ./crates/bdk
-        run: cargo check --target wasm32-unknown-unknown --features dev-getrandom-wasm
+        run: cargo check --target wasm32-unknown-unknown --no-default-features --features bitcoin/no-std,miniscript/no-std,bdk_chain/hashbrown,dev-getrandom-wasm
       - name: Check esplora
         working-directory: ./crates/esplora
-        run: cargo check --target wasm32-unknown-unknown --features async --no-default-features
+        run: cargo check --target wasm32-unknown-unknown --no-default-features --features bitcoin/no-std,miniscript/no-std,bdk_chain/hashbrown,async
 
   fmt:
     name: Rust fmt
index 2446bcc68f37ac3b4601092fcede71e4b9d14ecd..a90f1ab0f0f292799c97931a907cd970a66675e3 100644 (file)
@@ -15,11 +15,11 @@ rust-version = "1.57"
 [dependencies]
 log = "=0.4.18"
 rand = "^0.8"
-miniscript = { version = "9", features = ["serde"] }
-bitcoin = { version = "0.29", features = ["serde", "base64", "rand"] }
+miniscript = { version = "9", features = ["serde"], default-features = false }
+bitcoin = { version = "0.29", features = ["serde", "base64", "rand"], default-features = false }
 serde = { version = "^1.0", features = ["derive"] }
 serde_json = { version = "^1.0" }
-bdk_chain = { path = "../chain", version = "0.4.0", features = ["miniscript", "serde"] }
+bdk_chain = { path = "../chain", version = "0.4.0", features = ["miniscript", "serde"], default-features = false }
 
 # Optional dependencies
 hwi = { version = "0.5", optional = true, features = [ "use-miniscript"] }
@@ -29,17 +29,15 @@ bip39 = { version = "1.0.1", optional = true }
 getrandom = "0.2"
 js-sys = "0.3"
 
-
 [features]
 default = ["std"]
-std = []
+std = ["bitcoin/std", "miniscript/std", "bdk_chain/std"]
 compiler = ["miniscript/compiler"]
 all-keys = ["keys-bip39"]
 keys-bip39 = ["bip39"]
 hardware-signer = ["hwi"]
 test-hardware-signer = ["hardware-signer"]
 
-
 # This feature is used to run `cargo check` in our CI targeting wasm. It's not recommended
 # for libraries to explicitly include the "getrandom/js" feature, so we only do it when
 # necessary for running our CI. See: https://docs.rs/getrandom/0.2.8/getrandom/#webassembly-support
@@ -52,12 +50,10 @@ env_logger = "0.7"
 base64 = "^0.13"
 assert_matches = "1.5.0"
 
-
 [package.metadata.docs.rs]
 all-features = true
 rustdoc-args = ["--cfg", "docsrs"]
 
-
 [[example]]
 name = "mnemonic_to_descriptors"
 path = "examples/mnemonic_to_descriptors.rs"
index 83efb01a3b8aa674a08f87ab7ae60027dbff2c47..5b0f1930dc1fa045dfe42dfc2a9125a77a1f7d2c 100644 (file)
@@ -11,6 +11,8 @@
 
 //! Descriptor errors
 
+use core::fmt;
+
 /// Errors related to the parsing and usage of descriptors
 #[derive(Debug)]
 pub enum Error {
@@ -51,8 +53,8 @@ impl From<crate::keys::KeyError> for Error {
     }
 }
 
-impl std::fmt::Display for Error {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+impl fmt::Display for Error {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
         match self {
             Self::InvalidHdKeyPath => write!(f, "Invalid HD key path"),
             Self::InvalidDescriptorChecksum => {
index fcbb8288a9a2cd89d830be85ab17d8360544d4a3..22817a3ef7f62030fcd3fe4a273ea9127ecad84b 100644 (file)
@@ -107,8 +107,10 @@ impl fmt::Display for MiniscriptPsbtError {
     }
 }
 
+#[cfg(feature = "std")]
 impl std::error::Error for MiniscriptPsbtError {}
 
+#[cfg(feature = "std")]
 impl fmt::Display for Error {
     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
         match self {
index e8c9ca07e2f5aa9bd94af10bfabf570a2e451cb3..b4cfb6dee347b81bf1231d9581c196537abf51a7 100644 (file)
@@ -15,6 +15,7 @@ use crate::collections::HashSet;
 use alloc::string::{String, ToString};
 use alloc::vec::Vec;
 use core::any::TypeId;
+use core::fmt;
 use core::marker::PhantomData;
 use core::ops::Deref;
 use core::str::FromStr;
@@ -934,8 +935,8 @@ pub enum KeyError {
 impl_error!(miniscript::Error, Miniscript, KeyError);
 impl_error!(bitcoin::util::bip32::Error, Bip32, KeyError);
 
-impl std::fmt::Display for KeyError {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+impl fmt::Display for KeyError {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
         match self {
             Self::InvalidScriptContext => write!(f, "Invalid script context"),
             Self::InvalidNetwork => write!(f, "Invalid network"),
index 3f58921a96599613995ce5df32f6b64cc39e18a2..f2f717d9fea9cfa9c14ad754dd9ef8d9ec09625d 100644 (file)
@@ -170,9 +170,9 @@ pub enum NewError<P> {
     Persist(P),
 }
 
-impl<P> core::fmt::Display for NewError<P>
+impl<P> fmt::Display for NewError<P>
 where
-    P: core::fmt::Display,
+    P: fmt::Display,
 {
     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
         match self {
index bb4786675ca28d75c1bf2f4aee02424217c74f8e..0d8123ca78d81a2e11da06f94a35739e61171a87 100644 (file)
@@ -13,18 +13,18 @@ readme = "README.md"
 # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
 
 [dependencies]
-bitcoin = { version = "0.29" }
+bitcoin = { version = "0.29", default-features = false }
 serde_crate = { package = "serde", version = "1", optional = true, features = ["derive"] }
 
 # Use hashbrown as a feature flag to have HashSet and HashMap from it.
 # note version 0.13 breaks outs MSRV.
-hashbrown = { version = "0.12", optional = true,  features = ["serde"] }
-miniscript = { version = "9.0.0", optional = true  }
+hashbrown = { version = "0.12", optional = true, features = ["serde"] }
+miniscript = { version = "9.0.0", optional = true, default-features = false }
 
 [dev-dependencies]
 rand = "0.8"
 
 [features]
-default = ["std", "miniscript"]
-std = []
+default = ["std"]
+std = ["bitcoin/std"]
 serde = ["serde_crate", "bitcoin/serde" ]
index c5d42d35fca3581615840782ede46fdfbe3026f0..8c3cf3e8afaafcd1cafe2ad0660f27daffc2bd77 100644 (file)
@@ -12,13 +12,18 @@ readme = "README.md"
 # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
 
 [dependencies]
-bdk_chain = { path = "../chain", version = "0.4.0", features = ["serde", "miniscript"] }
+bdk_chain = { path = "../chain", version = "0.4.0", default-features = false, features = ["serde", "miniscript"] }
 esplora-client = { version = "0.5", default-features = false }
 async-trait = { version = "0.1.66", optional = true }
 futures = { version = "0.3.26", optional = true }
 
+# use these dependencies if you need to enable their /no-std features
+bitcoin = { version = "0.29", optional = true, default-features = false }
+miniscript = { version = "9.0.0", optional = true, default-features = false }
+
 [features]
-default = ["blocking"]
+default = ["std", "async-https", "blocking"]
+std = ["bdk_chain/std"]
 async = ["async-trait", "futures", "esplora-client/async"]
 async-https = ["async", "esplora-client/async-https"]
 blocking = ["esplora-client/blocking"]