๐Ÿ€ ATproto XRPC client for gleam possum.hexdocs.pm
gleam atproto xrpc-client library
41

Configure Feed

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

test: parse response body

kacaii.dev (Jun 30, 2026, 10:10 AM -0300) f4fe57b2 e2cda905

+80 -8
+46 -1
src/possum.gleam
··· 65 65 /// import gleam/http/request 66 66 /// import possum 67 67 /// 68 - /// let did = "did:plc:ewvi7nxzyoun6zhxrhs64oiz" 68 + /// let did = "did:plc:z72i7hdynmk6r22z27h6tvur" 69 69 /// 70 70 /// let request = 71 71 /// request.new() 72 72 /// |> possum.get_plc_data(did) 73 + /// ``` 74 + /// 75 + /// ## Response 76 + /// 77 + /// ```json 78 + /// { 79 + /// "did": "string", 80 + /// "verificationMethods": { 81 + /// "atproto": "string" 82 + /// }, 83 + /// "rotationKeys": [ 84 + /// "string", 85 + /// "string" 86 + /// ], 87 + /// "alsoKnownAs": [ 88 + /// "string" 89 + /// ], 90 + /// "services": { 91 + /// "atproto_pds": { 92 + /// "type": "string", 93 + /// "endpoint": "string" 94 + /// } 95 + /// } 73 96 /// ``` 74 97 /// 75 98 /// Documentation: [AT Protocol DIDs](https://atproto.com/specs/did) ··· 122 145 /// request.new() 123 146 /// |> request.set_host("personal.data-server.pds") 124 147 /// |> possum.resolve_handle("gleam.run") 148 + /// ``` 149 + /// 150 + /// ## Response 151 + /// 152 + /// ```json 153 + /// { 154 + /// "did": "string" 155 + /// } 125 156 /// ``` 126 157 /// 127 158 /// Endpoint Docs: [/xrpc/com.atproto.identity.resolveHandle](https://endpoints.bsky.app/#bluesky-app/tag/comatprotoidentity/GET/xrpc/com.atproto.identity.resolveHandle) ··· 272 303 /// request.new() 273 304 /// |> request.set_host("personal.data-server.pds") 274 305 /// |> possum.describe_repository(did) 306 + /// ``` 307 + /// 308 + /// ## Response 309 + /// 310 + /// ```json 311 + /// { 312 + /// "did": "string", 313 + /// "didDoc": null, 314 + /// "handle": "string", 315 + /// "collections": [ 316 + /// "string" 317 + /// ], 318 + /// "handleIsCorrect": true 319 + /// } 275 320 /// ``` 276 321 /// 277 322 /// Endpoint Docs: [/xrpc/com.atproto.repo.describeRepo](https://endpoints.bsky.app/#bluesky-app/tag/comatprotorepo/GET/xrpc/com.atproto.repo.describeRepo)
+34 -7
test/possum_test.gleam
··· 40 40 let decoder = 41 41 decode.at(["services", "atproto_pds", "endpoint"], decode.string) 42 42 43 - let assert Ok(pds) = 43 + let assert Ok("https://" <> pds) = 44 44 pds_response.body 45 45 |> json.parse(decoder) 46 46 ··· 56 56 |> possum.get_plc_data(context.did) 57 57 |> httpc.send() 58 58 59 - let assert Ok("https://" <> _pds) = 60 - response.body 61 - |> json.parse(decode.at( 62 - ["services", "atproto_pds", "endpoint"], 63 - decode.string, 64 - )) 59 + let decoder = { 60 + let empty = decode.dict(decode.dynamic, decode.dynamic) 61 + use _ <- decode.field("did", decode.string) 62 + use _ <- decode.field("verificationMethods", empty) 63 + use _ <- decode.field("rotationKeys", decode.list(decode.string)) 64 + use _ <- decode.field("alsoKnownAs", decode.list(decode.string)) 65 + use _ <- decode.field("services", empty) 66 + decode.success(Nil) 67 + } 65 68 69 + let assert Ok(_) = json.parse(response.body, decoder) 66 70 Nil 67 71 } 68 72 ··· 80 84 81 85 Nil 82 86 } 87 + 88 + pub fn describe_repository_test() -> Nil { 89 + let context = global_data() 90 + 91 + let assert Ok(response) = 92 + request.new() 93 + |> request.set_host(context.pds) 94 + |> possum.describe_repository(context.did) 95 + |> httpc.send 96 + 97 + let decoder = { 98 + let empty = decode.dict(decode.dynamic, decode.dynamic) 99 + use _ <- decode.field("did", decode.string) 100 + use _ <- decode.field("didDoc", decode.optional(empty)) 101 + use _ <- decode.field("handle", decode.string) 102 + use _ <- decode.field("collections", decode.list(decode.string)) 103 + use _ <- decode.field("handleIsCorrect", decode.bool) 104 + decode.success(Nil) 105 + } 106 + 107 + let assert Ok(_) = json.parse(response.body, decoder) 108 + Nil 109 + }