Added README.md file.

This commit is contained in:
2026-02-21 00:16:38 +01:00
parent 4e933df49a
commit 8670c509e8

96
README.md Normal file
View File

@@ -0,0 +1,96 @@
# triplex
`triplex` is a deterministic, reversible serial number engine for
high-integrity identifiers. It maps a compact 32-bit integer space to a
human-readable serial format:
```
LLL-NNN-LC
```
Where:
- `L` = data letter (`A``Z`)
- `N` = number (`100``999`)
- `C` = checksum letter (`A``Z`)
## What it provides
- 4 data letters
- 3 numeric digits (`100``999`)
- 1 checksum letter
- Optional forbidden-triplet filtering on the first three letters
- Reversible integer encoding/decoding
- Deterministic checksum generation
Total index capacity: **386,942,400** (`26^4 * 900`)
## Features
- Reversible mapping: `Encode(code) ↔ Decode(index)`
- Deterministic checksum: `C = 'A' + (index % 26)`
- Compact index space: fits in `uint32`
- Human-readable serial format
- Useful for manufacturing, logistics, SaaS identifiers, and audit-safe systems
## Example
```go
package main
import (
"fmt"
"git.hoiting.org/micha/triplex/serial"
)
func main() {
idx := uint32(123456)
code, err := serial.Decode(idx)
if err != nil {
panic(err)
}
idx2, err := serial.Encode(code)
if err != nil {
panic(err)
}
fmt.Println(code)
fmt.Println(idx == idx2) // true
}
```
## Notes
- The current serial format is `LLL-NNN-LC`.
- Forbidden-triplet logic is centralized in `serial.IsForbiddenTriplet` and can be tailored to project rules.
## API
- `serial.Encode(code string) (uint32, error)`
- Parses and validates `LLL-NNN-LC`, checks checksum, and returns the deterministic index.
- `serial.Decode(idx uint32) (string, error)`
- Converts a valid index back to `LLL-NNN-LC`.
- `serial.RandomCode(isInUse ...func(uint32) bool) (string, uint32, error)`
- Generates a random valid `LLL-NNN-LC` code and its corresponding index.
- If provided, the callback is used to skip indices already in use by the client.
Exported errors:
- `serial.ErrInvalidFormat`
- `serial.ErrInvalidLetters`
- `serial.ErrForbiddenLetterTriplet`
- `serial.ErrInvalidNumber`
- `serial.ErrNumberOutOfRange`
- `serial.ErrInvalidChecksum`
- `serial.ErrIndexOutOfRange`
- `serial.ErrRandomGenerationFailed`
## Testing
Run all tests:
```bash
go test ./...
```