Packages

Gleam SDK for Rockbox Zig — pipe-friendly client for the rockboxd GraphQL API

Current section

Files

Jump to
rockbox src rockbox.erl
Raw

src/rockbox.erl

-module(rockbox).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/rockbox.gleam").
-export([new/0, host/2, port/2, url/2, connect/1, build/1, default_client/0, at/2, transport/1, 'query'/4, execute/3, http_url/1]).
-export_type([client/0, builder/0]).
-if(?OTP_RELEASE >= 27).
-define(MODULEDOC(Str), -moduledoc(Str)).
-define(DOC(Str), -doc(Str)).
-else.
-define(MODULEDOC(Str), -compile([])).
-define(DOC(Str), -compile([])).
-endif.
?MODULEDOC(
" Rockbox Gleam SDK — pipe-friendly client for the rockboxd GraphQL API.\n"
"\n"
" ```gleam\n"
" import rockbox\n"
" import rockbox/playback\n"
"\n"
" pub fn main() {\n"
" let client = rockbox.connect()\n"
"\n"
" let assert Ok(track) = playback.current_track(client)\n"
" let assert Ok(_) = playback.pause(client)\n"
" }\n"
" ```\n"
"\n"
" Customise the connection with the builder:\n"
"\n"
" ```gleam\n"
" let client =\n"
" rockbox.new()\n"
" |> rockbox.host(\"rockbox.local\")\n"
" |> rockbox.port(8080)\n"
" |> rockbox.connect\n"
" ```\n"
).
-opaque client() :: {client, rockbox@internal@transport:transport()}.
-opaque builder() :: {builder,
binary(),
integer(),
gleam@option:option(binary())}.
-file("src/rockbox.gleam", 59).
?DOC(" Start a new client builder with sensible defaults (`localhost:6062`).\n").
-spec new() -> builder().
new() ->
{builder, <<"localhost"/utf8>>, 6062, none}.
-file("src/rockbox.gleam", 64).
?DOC(" Override the hostname (default `\"localhost\"`). Ignored if `url` is set.\n").
-spec host(builder(), binary()) -> builder().
host(Builder, Value) ->
{builder, Value, erlang:element(3, Builder), erlang:element(4, Builder)}.
-file("src/rockbox.gleam", 69).
?DOC(" Override the port (default `6062`). Ignored if `url` is set.\n").
-spec port(builder(), integer()) -> builder().
port(Builder, Value) ->
{builder, erlang:element(2, Builder), Value, erlang:element(4, Builder)}.
-file("src/rockbox.gleam", 74).
?DOC(" Override the full GraphQL HTTP URL. Takes precedence over `host` / `port`.\n").
-spec url(builder(), binary()) -> builder().
url(Builder, Value) ->
{builder,
erlang:element(2, Builder),
erlang:element(3, Builder),
{some, Value}}.
-file("src/rockbox.gleam", 79).
?DOC(" Finalise the builder and return a usable `Client`.\n").
-spec connect(builder()) -> client().
connect(Builder) ->
Http_url = case erlang:element(4, Builder) of
{some, Value} ->
Value;
none ->
<<<<<<<<"http://"/utf8, (erlang:element(2, Builder))/binary>>/binary,
":"/utf8>>/binary,
(erlang:integer_to_binary(erlang:element(3, Builder)))/binary>>/binary,
"/graphql"/utf8>>
end,
{client, {transport, Http_url}}.
-file("src/rockbox.gleam", 93).
?DOC(" Alias for `connect`. Use whichever name reads better in your code.\n").
-spec build(builder()) -> client().
build(Builder) ->
connect(Builder).
-file("src/rockbox.gleam", 102).
?DOC(" Shortcut for `new() |> connect()` — a client pointed at `localhost:6062`.\n").
-spec default_client() -> client().
default_client() ->
_pipe = new(),
connect(_pipe).
-file("src/rockbox.gleam", 107).
?DOC(" Shortcut for `new() |> host(host) |> port(port) |> connect()`.\n").
-spec at(binary(), integer()) -> client().
at(H, P) ->
_pipe = new(),
_pipe@1 = host(_pipe, H),
_pipe@2 = port(_pipe@1, P),
connect(_pipe@2).
-file("src/rockbox.gleam", 158).
?DOC(false).
-spec transport(client()) -> rockbox@internal@transport:transport().
transport(Client) ->
erlang:element(2, Client).
-file("src/rockbox.gleam", 132).
?DOC(
" Run a raw GraphQL operation against the server, decoding the `data` field\n"
" with the supplied decoder. Useful if you need an endpoint the SDK doesn't\n"
" expose directly yet.\n"
"\n"
" ```gleam\n"
" import gleam/dynamic/decode\n"
" import gleam/json\n"
"\n"
" let decoder = {\n"
" use version <- decode.field(\"rockboxVersion\", decode.string)\n"
" decode.success(version)\n"
" }\n"
"\n"
" let assert Ok(version) =\n"
" client\n"
" |> rockbox.query(\"query { rockboxVersion }\", json.object([]), decoder)\n"
" ```\n"
).
-spec 'query'(
client(),
binary(),
gleam@json:json(),
gleam@dynamic@decode:decoder(FIF)
) -> {ok, FIF} | {error, rockbox@error:error()}.
'query'(Client, Gql, Variables, Decoder) ->
rockbox@internal@transport:execute(
erlang:element(2, Client),
Gql,
Variables,
Decoder
).
-file("src/rockbox.gleam", 143).
?DOC(
" Like `query` but discards the response body — handy for fire-and-forget\n"
" mutations that return a boolean status flag you don't care about.\n"
).
-spec execute(client(), binary(), gleam@json:json()) -> {ok, nil} |
{error, rockbox@error:error()}.
execute(Client, Gql, Variables) ->
rockbox@internal@transport:execute_unit(
erlang:element(2, Client),
Gql,
Variables
).
-file("src/rockbox.gleam", 152).
?DOC(" Return the underlying GraphQL HTTP URL. Useful for diagnostics & tests.\n").
-spec http_url(client()) -> binary().
http_url(Client) ->
erlang:element(2, erlang:element(2, Client)).