anysc-rustls

Crates.ioanysc-rustls
lib.rsanysc-rustls
version0.1.1
created_at2025-08-13 21:38:33.043633+00
updated_at2025-09-12 09:33:32.905759+00
descriptioncrate-level shim layer for any {async crate}-rustls
homepagehttps://crates.io/crates/anysc-rustls
repositoryhttps://github.com/ohkami-rs/anysc-rustls
max_upload_size
id1794163
size30,697
core (github:ohkami-rs:core)

documentation

https://docs.rs/anysc-rustls

README

anysc-rustls

crate-level shim layer for any {async crate}-rustls


Usage

See the next section for details.

  1. Add to dependencies:

    [dependencies]
    # ...
    anysc-rustls = { version = "0.1", optional = true }
    
  2. Activate one of io_* feature flags:

  3. Depending on the use case, enable some inheritied features:

    • aws-lc-rs
    • aws_lc_rs
    • early-data
    • fips
    • logging
    • ring
    • tls12
  4. Write your code with anysc-rustls as with {tokio, futures}-rustls.


What this does?

Just reexporting all the items of one of

based on the io_* feature flag selected.

The point is that this is a crate: it enables, for some (maybe niche) crates that

  • support multiple async runtimes over different async IO interfaces (tokio::io, futures::io)
  • AND optionally provide rustls-powered TLS functionality behind a feature flag (like tls)

, to switch {async crate}-rustls dependencies without any needless dependencies.

Problem

That's impossible by other way: if simply having a submodule reexporting tokio-rustls and futures-rustls conditionally with respective feature flags (like tokio-io, futures-io), indeed it works, but the crate's [dependencies] will be like

[dependencies]
tokio-rustls = { optional = true, version = ... }
futures-rustls = { optional = true, version = ... }

[features]
tokio-io = ...
futures-io = ...
tls = ...

Here, how we setup the features?

  1. tokio-io = if "tls" ["dep:tokio-rustls"] + futures-io = if "tls" ["dep:futures-tls"]

    impossible.

  2. tls = if "tokio-io" ["dep:tokio-rustls"] else if "futures-io" ["dep:futures-tls"]

    impossible.

  3. tls = ["dep:tokio-rustls", "dep:futures-rustls"]

    works, but one of them must be needless.

So it's impossible to avoid undesired dependencies in this way.

Solution

However, it's enabled by a crate-level shim layer as this crate:

[dependencies]
anysc-rustls = { version = "0.1", optional = true }

[features]
tls = ["dep:anysc-rustls"]
tokio-io = ["anysc-rustls?/io_tokio", ...]
futures-io = ["anysc-rustls?/io_futures", ...]

Yes, that's done by the <crate>?/<feature> syntax!

Commit count: 12

cargo fmt