···33import shared/user
4455pub type Session {
66+ /// User is sucessfully authenticated
67 Authenticated(user: user.User)
88+ /// User is waiting for the Server to validate their credentials
79 Pending(on_success: route.Route, on_error: route.Route)
8101111+ /// User is not logged out
912 None
1013}
11141215pub fn decoder() -> decode.Decoder(Session) {
1316 use variant <- decode.field("type", decode.string)
1717+1418 case variant {
1519 "authenticated" -> {
1616- use user <- decode.field("user", todo)
2020+ use user <- decode.field("user", user.decoder())
1721 decode.success(Authenticated(user:))
1822 }
1923
+17
shared/src/shared/user.gleam
···11+import gleam/dynamic/decode
12import youid/uuid
2334pub type User {
45 User(id: uuid.Uuid, full_name: String, email: String)
56}
77+88+pub fn decoder() -> decode.Decoder(User) {
99+ use id <- decode.field("id", uuid_decoder())
1010+ use full_name <- decode.field("full_name", decode.string)
1111+ use email <- decode.field("email", decode.string)
1212+1313+ decode.success(User(id:, full_name:, email:))
1414+}
1515+1616+fn uuid_decoder() -> decode.Decoder(uuid.Uuid) {
1717+ use str <- decode.then(decode.string)
1818+ case uuid.from_string(str) {
1919+ Ok(value) -> decode.success(value)
2020+ Error(_) -> decode.failure(uuid.v7(), "Uuid")
2121+ }
2222+}