OpenPay (1 crate, 1801 LOC, 57 tests)
op-bin BIN/IIN database + range matching + card-network
classification. 8-digit normalized prefix Bin +
BinRange. Sorted-vec interval tree with O(log N) point
lookup + overlap rejection. CardNetwork classify()
with structural rules (Visa 4, MC 51-55/2221-2720,
Amex 34/37, Discover, JCB, Diners, UnionPay, RuPay,
Mir, Troy, Maestro, Elo). Static prefix tables +
build_default_tree(). ISO/IEC 7812-1 Annex B Luhn
(validate / is_valid / check_digit). Card-type +
issuer-country + Durbin regulated-debit. PCI-safe:
8-digit cap, no full-PAN APIs.
Smart Byte (1 crate, ~1500 LOC, 20 tests)
smart-byte-tendermint BFT consensus. Step enum + Round + propose/prevote/
precommit/commit FSM with voting-power tallies.
ValidatorSet with 2/3+1 quorum, 1/3+1 trust
threshold, round-robin proposer. Block / Header /
Commit / CommitSig with Blake3 hashing. Light client
(sequential + skipping). ABCI Application trait +
EchoApp. DuplicateVoteEvidence + LightClientAttackEvidence.
IBC ClientState + ConsensusState + light-client
update.
EOC (1 crate, 2084 LOC, 23 tests)
eoc-safety AI safety primitives. RegexSet over 16 prompt-injection
signatures. 13-family jailbreak detector (DAN/DUDE/
Grandma/STAN/AIM/dev-mode/etc.). Presidio-style PII
redactor with Luhn-validated CC. Toxicity / bias /
NSFW classifier traits + heuristic baselines (5-axis
bias, 4-category NSFW with hard-reject for minors).
Constitutional AI critique→revise loop. Composable
InputGuard / OutputGuard pipelines. JSON-Schema-subset
output validator. Token-bucket rate limiter +
abuse-window detection. Red-team replay harness.
Co-Authored-By: Claude Opus 4.7 <[email protected]>
42 lines
1.2 KiB
Rust
42 lines
1.2 KiB
Rust
//! Sealed error type.
|
|
|
|
use thiserror::Error;
|
|
|
|
/// Crate result alias.
|
|
pub type Result<T> = core::result::Result<T, Error>;
|
|
|
|
/// All failure modes for BIN parsing, lookup, and classification.
|
|
#[derive(Debug, Error, Clone, PartialEq, Eq)]
|
|
pub enum Error {
|
|
/// BIN must be 6, 7, or 8 ASCII digits.
|
|
#[error("invalid BIN length: got {got} digits, want 6..=8")]
|
|
InvalidBinLength {
|
|
/// Length of the rejected input.
|
|
got: usize,
|
|
},
|
|
|
|
/// BIN contained a non-ASCII-digit character.
|
|
#[error("invalid BIN character: {0:?}")]
|
|
InvalidBinCharacter(char),
|
|
|
|
/// No range in the tree contains the queried BIN.
|
|
#[error("no range for BIN: {0}")]
|
|
NoRange(String),
|
|
|
|
/// A range was constructed with `low >= high` (empty / inverted).
|
|
#[error("invalid range: low {low} must be < high {high}")]
|
|
InvalidRange {
|
|
/// Inclusive lower bound (8-digit form).
|
|
low: u32,
|
|
/// Exclusive upper bound (8-digit form).
|
|
high: u32,
|
|
},
|
|
|
|
/// Luhn check failed.
|
|
#[error("luhn check failed")]
|
|
LuhnFailed,
|
|
|
|
/// Country code was not a 2-character ASCII-uppercase string.
|
|
#[error("invalid ISO 3166-1 alpha-2 country code: {0:?}")]
|
|
InvalidCountryCode(String),
|
|
}
|