// From SIP 01: // - **Canonical SSB URIs** // - `ssb:message/classic/` // - `ssb:message/bendybutt-v1/` // - `ssb:message/gabbygrove-v1/` // - `ssb:message/buttwoo-v1/` // - `ssb:feed/classic/` // - `ssb:feed/bendybutt-v1/` // - `ssb:feed/gabbygrove-v1/` // - `ssb:feed/buttwoo-v1/` // - `ssb:feed/buttwoo-v1//` // - `ssb:blob/classic/` // - `ssb:address/multiserver?multiserverAddress=` // - `ssb:encryption-key/box2-dm-dh/` // - `ssb:identity/po-box/` // - `ssb:identity/fusion/` pub type SsbUri { Canonical(CanonicalUri) Experimental(ExperimentalUri) } // note: For Deprecated SSB URIs they should be treated syntactically as Canonical URIs, // the semantic level is where they should be treated differently (ex: emit warnings) // - **Deprecated SSB URIs** // - `ssb:message/sha256/` // - `ssb:feed/ed25519/` // - `ssb:blob/sha256/` pub type CanonicalUri { Message(MessageUri) Feed(FeedUri) Blob(BlobUri) Address(AddressUri) EncryptionKey(EncryptionKeyUri) Identity(IdentityUri) } // - `ssb:message/classic/` // - `ssb:message/bendybutt-v1/` // - `ssb:message/gabbygrove-v1/` // - `ssb:message/buttwoo-v1/` pub type MessageUri { ClassicMessage(ClassicMessageId) BendyButtMessage(BendyButtMessageId) GabbyGroveV1Message(GabbyGroveV1MessageId) ButtWooV1Message(ButtWooV1MessageId) } pub opaque type ClassicMessageId { ClassicMessageId(BitArray) } pub opaque type BendyButtMessageId { BendyButtMessageId(BitArray) } pub opaque type GabbyGroveV1MessageId { GabbyGroveV1MessageId(BitArray) } pub opaque type ButtWooV1MessageId { ButtWooV1MessageId(BitArray) } // - `ssb:feed/classic/` // - `ssb:feed/bendybutt-v1/` // - `ssb:feed/gabbygrove-v1/` // - `ssb:feed/buttwoo-v1/` // - `ssb:feed/buttwoo-v1//` pub type FeedUri // - `ssb:blob/classic/` pub type BlobUri // - `ssb:address/multiserver?multiserverAddress=` pub type AddressUri { MultiServerAddress(MultiServerAddressUri) } pub opaque type MultiServerAddressUri { MultiServerAddressUri(String) } // - `ssb:encryption-key/box2-dm-dh/` pub type EncryptionKeyUri { Box2DmDh(Box2DmDhKey) } pub opaque type Box2DmDhKey { Box2DmDhKey(BitArray) } // - `ssb:identity/po-box/` // - `ssb:identity/fusion/` pub type IdentityUri { PoBox(PoBoxKey) Fusion(FusionKey) } pub opaque type PoBoxKey { PoBoxKey(BitArray) } pub opaque type FusionKey { FusionKey(BitArray) } // - **Experimental SSB URIs** // - `ssb:experimental?action=claim-http-invite&invite=&multiserverAddress=` // - `ssb:experimental?action=consume-alias&alias=&userId=&signature=&roomId=&multiserverAddress=` // - `ssb:experimental?action=start-http-auth&sid=&sc=` pub type ExperimentalUri // similar to canonical? // Questions: // Because Gleam doesn't have typeclasses, should I aim for a flatter type hierachy? // Is my current design overkill/cumbersome in Gleam?