An Elixir toolkit for the AT Protocol. hexdocs.pm/atex
elixir bluesky atproto decentralization
25
fork

Configure Feed

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

refactor(xrpc): extract shared handle_lexicon_response helper

+51 -81
+51 -81
lib/atex/xrpc.ex
··· 70 70 71 71 def get(client, %{__struct__: module} = query, opts) do 72 72 opts = put_params(opts, query) 73 - output_struct = Module.concat(module, Output) 74 - output_exists = Code.ensure_loaded?(output_struct) 75 - coerce_exists = function_exported?(module, :coerce_error, 1) 76 73 77 - case client.__struct__.get(client, module.id(), opts) do 78 - {:ok, %{status: 200} = response, client} -> 79 - if output_exists do 80 - case output_struct.from_json(response.body) do 81 - {:ok, output} -> 82 - {:ok, %{response | body: output}, client} 83 - 84 - err -> 85 - err 86 - end 87 - else 88 - {:ok, response, client} 89 - end 90 - 91 - {:ok, %{body: %{"error" => _}} = response, client} when coerce_exists -> 92 - case module.coerce_error(response.body) do 93 - {:ok, %Error{} = error} -> 94 - {:ok, %{response | body: error}, client} 95 - 96 - {:error, %Error{} = error} -> 97 - {:error, error, client} 98 - end 99 - 100 - {:ok, %{body: %{"error" => error} = body}, client} -> 101 - {:error, 102 - %Error{ 103 - error: error, 104 - message: Map.get(body, "message"), 105 - error_struct: nil 106 - }, client} 107 - 108 - {:ok, _, _} = ok -> 109 - ok 110 - 111 - err -> 112 - err 113 - end 74 + client.__struct__.get(client, module.id(), opts) 75 + |> handle_lexicon_response(module) 114 76 end 115 77 116 78 @doc """ ··· 190 152 |> put_params(procedure) 191 153 |> put_body(procedure) 192 154 193 - output_struct = Module.concat(module, Output) 194 - output_exists = Code.ensure_loaded?(output_struct) 195 - coerce_exists = function_exported?(module, :coerce_error, 1) 196 - 197 - case client.__struct__.post(client, module.id(), opts) do 198 - {:ok, %{status: 200} = response, client} -> 199 - if output_exists do 200 - case output_struct.from_json(response.body) do 201 - {:ok, output} -> 202 - {:ok, %{response | body: output}, client} 203 - 204 - err -> 205 - err 206 - end 207 - else 208 - {:ok, response, client} 209 - end 210 - 211 - {:ok, %{body: %{"error" => _}} = response, client} when coerce_exists -> 212 - case module.coerce_error(response.body) do 213 - {:ok, %Error{} = error} -> 214 - {:ok, %{response | body: error}, client} 215 - 216 - {:error, %Error{} = error} -> 217 - {:error, error, client} 218 - end 219 - 220 - {:ok, %{body: %{"error" => error} = body}, client} -> 221 - {:error, 222 - %Error{ 223 - error: error, 224 - message: Map.get(body, "message"), 225 - error_struct: nil 226 - }, client} 227 - 228 - {:ok, _, _} = ok -> 229 - ok 230 - 231 - err -> 232 - err 233 - end 155 + client.__struct__.post(client, module.id(), opts) 156 + |> handle_lexicon_response(module) 234 157 end 235 158 236 159 @doc """ ··· 272 195 defp put_body(keyword, %{input: json}), do: Keyword.put(keyword, :json, json) 273 196 defp put_body(keyword, %{raw_input: body}), do: Keyword.put(keyword, :body, body) 274 197 defp put_body(keyword, _), do: keyword 198 + 199 + @spec handle_lexicon_response( 200 + {:ok, Req.Response.t(), Client.client()} 201 + | {:error, any(), Client.client()} 202 + | {:error, any()}, 203 + module() 204 + ) :: 205 + {:ok, Req.Response.t(), Client.client()} 206 + | {:error, any(), Client.client()} 207 + | {:error, any()} 208 + defp handle_lexicon_response(result, module) do 209 + output_struct = Module.concat(module, Output) 210 + output_exists = Code.ensure_loaded?(output_struct) 211 + coerce_exists = function_exported?(module, :coerce_error, 1) 212 + 213 + case result do 214 + {:ok, %{status: 200} = response, client} -> 215 + if output_exists do 216 + case output_struct.from_json(response.body) do 217 + {:ok, output} -> {:ok, %{response | body: output}, client} 218 + err -> err 219 + end 220 + else 221 + {:ok, response, client} 222 + end 223 + 224 + {:ok, %{body: %{"error" => _}} = response, client} when coerce_exists -> 225 + case module.coerce_error(response.body) do 226 + {:ok, %Error{} = error} -> {:ok, %{response | body: error}, client} 227 + {:error, %Error{} = error} -> {:error, error, client} 228 + end 229 + 230 + {:ok, %{body: %{"error" => error} = body}, client} -> 231 + {:error, 232 + %Error{ 233 + error: error, 234 + message: Map.get(body, "message"), 235 + error_struct: nil 236 + }, client} 237 + 238 + {:ok, _, _} = ok -> 239 + ok 240 + 241 + err -> 242 + err 243 + end 244 + end 275 245 end