馃搱 SPA for bank credit score analysis
lustre
frontent
oat-ui
gleam
1.6 kB
61 lines
1import gleam/dynamic/decode
2import gleam/json
3
4pub type User {
5 User(id: Int, role: Role, full_name: String, email: String)
6}
7
8pub type Role {
9 /// Regular user with default permissions
10 Default
11 /// User with elevated access to the system
12 Admin
13}
14
15pub fn to_json(self: User) -> json.Json {
16 json.object([
17 #("id", json.int(self.id)),
18 #("role", role_to_json(self.role)),
19 #("full_name", json.string(self.full_name)),
20 #("email", json.string(self.email)),
21 ])
22}
23
24pub fn decoder() -> decode.Decoder(User) {
25 // How its represented in client-side
26 let decoder_eng = {
27 use id <- decode.field("id", decode.int)
28 use role <- decode.field("role", role_decoder())
29 use full_name <- decode.field("full_name", decode.string)
30 use email <- decode.field("email", decode.string)
31
32 decode.success(User(id:, role:, full_name:, email:))
33 }
34
35 // How its represented in server-side
36 let decoder_ptbr = {
37 use id <- decode.field("id", decode.int)
38 use full_name <- decode.field("nome", decode.string)
39 use email <- decode.field("email", decode.string)
40 use role <- decode.field("tipo_usuario", role_decoder())
41 decode.success(User(id:, role:, full_name:, email:))
42 }
43
44 decode.one_of(decoder_eng, [decoder_ptbr])
45}
46
47fn role_to_json(role: Role) -> json.Json {
48 case role {
49 Default -> json.string("default")
50 Admin -> json.string("admin")
51 }
52}
53
54fn role_decoder() -> decode.Decoder(Role) {
55 use variant <- decode.then(decode.string)
56 case variant {
57 "default" | "cliente" -> decode.success(Default)
58 "admin" | "analista" -> decode.success(Admin)
59 _ -> decode.failure(Default, "Role")
60 }
61}