A Discord API Library for Gleam! 💫
0
fork

Configure Feed

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

allowed mentions

+134
+134
src/flybycord/message/allowed_mentions.gleam
··· 1 + import gleam/dynamic/decode 2 + import gleam/json.{type Json} 3 + import gleam/list 4 + import gleam/option.{type Option, None, Some} 5 + 6 + // TYPES ----------------------------------------------------------------------- 7 + 8 + pub type AllowedMentions { 9 + AllowedMentions( 10 + types: Option(List(Type)), 11 + roles_ids: Option(List(String)), 12 + users_ids: Option(List(String)), 13 + replied_user: Option(Bool), 14 + ) 15 + } 16 + 17 + pub type Type { 18 + Roles 19 + Users 20 + Everyone 21 + } 22 + 23 + // DECODERS -------------------------------------------------------------------- 24 + 25 + @internal 26 + pub fn decoder() -> decode.Decoder(AllowedMentions) { 27 + use types <- decode.optional_field( 28 + "parse", 29 + None, 30 + decode.optional(decode.list(type_decoder())), 31 + ) 32 + use roles_ids <- decode.optional_field( 33 + "roles", 34 + None, 35 + decode.optional(decode.list(decode.string)), 36 + ) 37 + 38 + use users_ids <- decode.optional_field( 39 + "users", 40 + None, 41 + decode.optional(decode.list(decode.string)), 42 + ) 43 + use replied_user <- decode.optional_field( 44 + "replied_user", 45 + None, 46 + decode.optional(decode.bool), 47 + ) 48 + 49 + decode.success(AllowedMentions(types:, roles_ids:, users_ids:, replied_user:)) 50 + } 51 + 52 + @internal 53 + pub fn type_decoder() -> decode.Decoder(Type) { 54 + use variant <- decode.then(decode.string) 55 + case variant { 56 + "roles" -> decode.success(Roles) 57 + "users" -> decode.success(Users) 58 + "everyone" -> decode.success(Everyone) 59 + _ -> decode.failure(Roles, "Type") 60 + } 61 + } 62 + 63 + // ENCODERS -------------------------------------------------------------------- 64 + 65 + @internal 66 + pub fn encode(allowed_mentions: AllowedMentions) -> Json { 67 + let types = case allowed_mentions.types { 68 + Some(types) -> [#("parse", json.array(types, type_encode))] 69 + None -> [] 70 + } 71 + 72 + let roles_ids = case allowed_mentions.roles_ids { 73 + Some(ids) -> [#("roles", json.array(ids, json.string))] 74 + None -> [] 75 + } 76 + 77 + let users_ids = case allowed_mentions.users_ids { 78 + Some(ids) -> [#("users", json.array(ids, json.string))] 79 + None -> [] 80 + } 81 + 82 + let replied_user = case allowed_mentions.replied_user { 83 + Some(allowed) -> [#("replied_user", json.bool(allowed))] 84 + None -> [] 85 + } 86 + 87 + [types, roles_ids, users_ids, replied_user] 88 + |> list.flatten 89 + |> json.object 90 + } 91 + 92 + @internal 93 + pub fn type_encode(type_: Type) -> Json { 94 + case type_ { 95 + Users -> "users" 96 + Roles -> "roles" 97 + Everyone -> "everyone" 98 + } 99 + |> json.string 100 + } 101 + 102 + // PUBLIC API FUNCTIONS -------------------------------------------------------- 103 + 104 + pub fn new() -> AllowedMentions { 105 + AllowedMentions(None, None, None, None) 106 + } 107 + 108 + pub fn with_types( 109 + allowed_mentions: AllowedMentions, 110 + types: List(Type), 111 + ) -> AllowedMentions { 112 + AllowedMentions(..allowed_mentions, types: Some(types)) 113 + } 114 + 115 + pub fn with_roles_ids( 116 + allowed_mentions: AllowedMentions, 117 + roles_ids: List(String), 118 + ) -> AllowedMentions { 119 + AllowedMentions(..allowed_mentions, roles_ids: Some(roles_ids)) 120 + } 121 + 122 + pub fn with_users_ids( 123 + allowed_mentions: AllowedMentions, 124 + users_ids: List(String), 125 + ) -> AllowedMentions { 126 + AllowedMentions(..allowed_mentions, users_ids: Some(users_ids)) 127 + } 128 + 129 + pub fn with_replied_user( 130 + allowed_mentions: AllowedMentions, 131 + replied_user: Bool, 132 + ) -> AllowedMentions { 133 + AllowedMentions(..allowed_mentions, replied_user: Some(replied_user)) 134 + }