馃搱 SPA for bank credit score analysis
lustre frontent oat-ui gleam
0

Configure Feed

Select the types of activity you want to include in your feed.

vertis-climate / src / client / user.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}