Added README.md file.
This commit is contained in:
96
README.md
Normal file
96
README.md
Normal 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 ./...
|
||||||
|
```
|
||||||
Reference in New Issue
Block a user