Expand description
Opaque identity newtypes used throughout the application.
Using distinct types for ProfileId, BucketId, and ObjectKey prevents
accidental substitution (e.g. passing a bucket name where an object key is
expected) at the type level.
§Design choices
- Backed by
Stringrather than a parsedUuidso that compat providers with non-UUID profile identifiers work without special-casing. ProfileId::new_v4()is the default mint strategy, not a constraint.From<&str>andFrom<String>for ergonomic construction.Deref<Target=str>is intentionally NOT implemented — auto-coercion would mask type-level bugs.