Repository navigation
fix(adapters)!: return each adapter's own MissingFeature, not rind's - #420
Conversation
rind-rustls, rind-dimpl, and rind-object-store's provider constructors now return their crate's own MissingFeature, and rind-ring's cpu module wraps rind's check with its own MissingFeature, so a rind major bump no longer forces the adapters' majors. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Your OpenCode Go account is out of credit. Top it up, then re-trigger Pullfrog. OpenCode Go's response
|
|
Warning Review limit reachedYou've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository. Next included review available in 20 minutes. View limit details
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. |
kixelated
left a comment
There was a problem hiding this comment.
Automated review by review (OpenAI)
Reviewed 7413ad7. No actionable findings. Adapter-owned error wrappers are a sound direction for removing the exposed rind error type: the existing CPU checks remain before provider/ticketer creation, Display preserves the underlying diagnostic, and Ticketer::new consistently wraps the adapter's error for downcasts. The breaking return-type changes are documented.
Verification: GitHub-only static review of all eight changed files and the underlying CPU-check/error implementation. I did not compile the crates, run doctests, exercise unsupported-CPU failures, or independently verify the reported checks.
…g, not a rind type Generic code bounded by `E: RsaEncoding` could call the sealed supertrait's `rind()` and get a `rind::signature::RsaSigningAlgorithm`. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
kixelated
left a comment
There was a problem hiding this comment.
Automated review by review (OpenAI)
Reviewed f66b62b, including the update since 7413ad7. No actionable findings. Returning rind-ring's own Padding from the sealed supertrait closes the additional public type leak while preserving the same static RSA signing algorithm and signature-length checks. The rind field remains inaccessible to downstream callers; the adapter-owned CPU errors remain consistent with the earlier review.
Verification: GitHub-only static review of the current nine-file diff and surrounding RSA trait, re-export, and signing code. I did not compile, run tests or doctests, or independently verify the reported checks.

Problem
AGENTS.md puts each third-party adapter in its own
rind-<consumer>crate so a major bump on one side never forces one on the other. But four adapters name a rind type in their public API, and rind-ring lets generic code reach one, so rind 0.2.0 (#367) would force their majors too:rind_rustls::default_provider()andempty_provider(),rind_dimpl::default_provider(), andrind_object_store::default_provider()returnrind::cpu::MissingFeature.rind::cpu(unreleased, from feat(rind-ring): re-export rind's CPU check as cpu #377).signature::RsaEncodinglets generic code reach a&'static rind::signature::RsaSigningAlgorithmthrough its hidden supertrait.Approach
Per the maintainer's decision (2026-11-06), each of those adapters defines its own
pub struct MissingFeature(Debug,Display,Error) and returns it. It wraps rind's error in a private field and delegatesDisplay, so the message stays rind's (for example "rind requires AES-NI CPU support on x86_64") without copying it into four crates, and rind needs no new accessor.MissingFeatureat the crate root.pub mod cpu { pub fn check() -> Result<(), MissingFeature>; pub struct MissingFeature }, wrapping rind's.rind_rustls::Ticketer::new()wraps the newrind_rustls::MissingFeaturein rustls'sOtherError, so a downcast finds the adapter's type too.signature::RsaEncodingbuilds on a sealed, unnameable supertrait whose method generic code bounded byE: RsaEncodingcan still call. It returned&'static rind::signature::RsaSigningAlgorithm; it now returns rind-ring's own (unnameable,Debug-only)Padding, whose rind field is visible only insidersa.lib.rs,sign/any_of.rs) and the MIGRATING.md adapter section now name the adapter's type.Impact
rind_rustls::default_provider(),rind_rustls::empty_provider(): returnrind_rustls::MissingFeature. Migrate: replacerind::cpu::MissingFeaturewithrind_rustls::MissingFeaturein signatures;?intoBox<dyn Error>and.to_string()are unchanged.rind_dimpl::default_provider(): returnsrind_dimpl::MissingFeature. Migrate the same way.rind_object_store::default_provider(): returnsrind_object_store::MissingFeature. Migrate the same way.rind_rustls::Ticketer::new(): therustls::OtherErrorit returns on an unsupported CPU now holdsrind_rustls::MissingFeature; same message.rind_ring::cpu: nowcheck()andMissingFeatureonly, rind-ring's own types; dropshas_aes_hardware(). Unreleased, so nothing shipped breaks.rind_ring::signature::RsaEncoding: its hidden supertrait's method is nowpadding(&self) -> &Paddinginstead ofrind(&self) -> &'static rind::signature::RsaSigningAlgorithm. Only reachable through a generic bound and never nameable, so no documented API changes.rind_rustls::MissingFeature,rind_dimpl::MissingFeature,rind_object_store::MissingFeature,rind_ring::cpu::MissingFeature.The
!title makes release-plz bump rind-dimpl and rind-object-store to 0.2.0 instead of 0.1.14 (it plans each package from the conventional commits touching it; on 0.x a breaking commit bumps the minor).Caused by
rind::cpu::MissingFeature.rind::cpu.RsaEncoding's hidden supertrait returned a rind type.Decisions
MissingFeaturewrapping rind's (rejected:Box<dyn Error>, the consumer crate's error type), by the maintainer on 2026-11-06.RsaEncodingsupertrait method returning a rind type: ✅ hide it, in this PR (rejected: accept it), by the maintainer on 2026-11-06. It returns rind-ring'sPaddingrather than a new wrapper type, sincePaddingalready exists and theRSA_*statics already hand it out.Alternatives
Box<dyn Error>or the consumer crate's error type: rejected by the maintainer.feature()accessor onrind::cpu::MissingFeature, with each adapter holding the&'static strand formatting the message itself: copies the message into four crates; the private wrapper keeps one.Validation
just check: passed on f66b62b, merged with main at ddd7fa0 (lint, build, tests, and doctests for every changed crate and its dependents).Models
Size: S
Implementer: Claude Code, claude-opus-5-5, high effort
Review
Rewritten by
quest reviewafter each round.01a1b300-70e1-7fa1-879f-3bfece53e73c, round 1The specified diff preserves CPU validation, diagnostics, and RSA signing behavior with no actionable findings; diff checks passed, but builds and tests were not run in the read-only environment.