Context
PR #724 makes reqwest optional by introducing base provider features such as:
cloud-base
aws-base
azure-base
gcp-base
http-base
PR #707 makes the crypto provider configurable by separating the provider implementation from the default bundled crypto choice.
Together, these changes introduce two independent configuration axes:
-
HTTP transport
- use the built-in
reqwest transport
- or provide a custom HTTP connector
-
Crypto provider
- use the default bundled crypto provider
- or provide/configure crypto externally
This raises a naming question for the feature model before the next release.
Proposal
Use *-base for provider implementation features, and compose transport and crypto independently.
cloud-base = [
# shared cloud implementation deps, no default reqwest or bundled crypto choice
]
reqwest = [
"dep:reqwest",
"reqwest/stream",
]
aws-lc-rs = [
"dep:aws-lc-rs",
]
ring = [
"dep:ring",
]
cloud = [
"cloud-base",
"reqwest",
"aws-lc-rs",
]
aws-base = [
"cloud-base",
"crc-fast",
"md-5",
]
aws = [
"aws-base",
"reqwest",
"aws-lc-rs",
]
azure-base = [
"cloud-base",
"httparse",
]
azure = [
"azure-base",
"reqwest",
"aws-lc-rs",
]
gcp-base = [
"cloud-base",
"rustls-pki-types",
]
gcp = [
"gcp-base",
"reqwest",
"aws-lc-rs",
]
http-base = [
"cloud-base",
]
http = [
"http-base",
"reqwest",
"aws-lc-rs",
]
Rationale
cloud-base means shared cloud implementation without the default transport or bundled crypto choice.
*-base means provider-specific implementation without the default transport or bundled crypto choice.
reqwest means enabling the built-in HTTP transport.
aws-lc-rs and ring represent explicit crypto provider choices.
aws, azure, gcp, and http preserve the existing batteries-included behavior.
cloud is preserved for backwards compatibility.
- Provider features compose directly from
*-base + reqwest + crypto-provider for clarity.
The core model is:
cloud-base = shared cloud implementation without default reqwest or bundled crypto
aws-base = cloud-base + AWS/S3-specific implementation deps
azure-base = cloud-base + Azure-specific implementation deps
gcp-base = cloud-base + GCS-specific implementation deps
http-base = cloud-base + HTTP-specific implementation deps
reqwest = built-in reqwest HTTP transport
aws-lc-rs = bundled aws-lc-rs crypto provider
ring = bundled ring crypto provider
cloud = cloud-base + reqwest + default crypto provider
compatibility alias for the old cloud behavior
aws = aws-base + reqwest + default crypto provider
azure = azure-base + reqwest + default crypto provider
gcp = gcp-base + reqwest + default crypto provider
http = http-base + reqwest + default crypto provider
Example advanced compositions
# S3 implementation only; user provides HTTP connector and crypto provider
object_store = { default-features = false, features = ["aws-base"] }
# S3 implementation + built-in reqwest, but user controls crypto provider
object_store = { default-features = false, features = ["aws-base", "reqwest"] }
# S3 implementation + custom HTTP connector, but object_store provides default crypto
object_store = { default-features = false, features = ["aws-base", "aws-lc-rs"] }
# S3 implementation + built-in reqwest + explicit crypto provider
object_store = { default-features = false, features = ["aws-base", "reqwest", "ring"] }
Open question
Should we standardize on this naming convention before the next release, so optional transport and optional crypto use the same composable feature model?
Context
PR #724 makes
reqwestoptional by introducing base provider features such as:cloud-baseaws-baseazure-basegcp-basehttp-basePR #707 makes the crypto provider configurable by separating the provider implementation from the default bundled crypto choice.
Together, these changes introduce two independent configuration axes:
HTTP transport
reqwesttransportCrypto provider
This raises a naming question for the feature model before the next release.
Proposal
Use
*-basefor provider implementation features, and compose transport and crypto independently.Rationale
cloud-basemeans shared cloud implementation without the default transport or bundled crypto choice.*-basemeans provider-specific implementation without the default transport or bundled crypto choice.reqwestmeans enabling the built-in HTTP transport.aws-lc-rsandringrepresent explicit crypto provider choices.aws,azure,gcp, andhttppreserve the existing batteries-included behavior.cloudis preserved for backwards compatibility.*-base + reqwest + crypto-providerfor clarity.The core model is:
Example advanced compositions
Open question
Should we standardize on this naming convention before the next release, so optional transport and optional crypto use the same composable feature model?