scruffy

Package Version Hex Docs

A Gleam client for the Scryfall Magic: The Gathering API.

Status

scruffy provides Gleam types for the objects the Scryfall API returns (cards, sets, rulings, symbols, and more) under scruffy/*, along with a Glon *_schema() decoder for each one – e.g. card.card_schema() turns a card JSON string into a Card via glon.decode(card.card_schema(), from: json).

On top of that, scruffy/client/* gives you a pair of plain functions for every Scryfall endpoint: a *_request that builds the Request(String) to send, and a *_response that decodes the Response(String) you got back into the object you asked for, or a scruffy/client.ClientError describing what went wrong.

Installation

gleam add scruffy@1

Usage

scruffy never picks an HTTP client for you. Build a request with a *_request function, send it with whatever HTTP client suits your project, and decode the response with the matching *_response function. On Erlang, that HTTP client can be gleam_httpc’s send:

import gleam/httpc
import gleam/io
import gleam/result
import scruffy/client
import scruffy/client/cards

pub fn main() -> Nil {
  let result = {
    use resp <- result.try(
      cards.get_card_by_id_request("bd8fa327-dd41-4737-8f19-2cf5eb1f7cdd")
      |> httpc.send,
    )
    cards.card_response(resp)
  }

  case result {
    Ok(card) -> io.println(card.name)
    Error(client.ApiError(err)) -> io.println("Scryfall said: " <> err.details)
    Error(_) -> io.println("Something else went wrong")
  }
}

The same two functions work with a Promise-based client too (e.g. gleam_fetch on the JavaScript target) – just await the response between them:

use resp <- promise.try_await(fetch.send(cards.get_card_by_id_request(id)))
use resp <- promise.try_await(fetch.read_text_body(resp))
promise.resolve(cards.card_response(resp))

Further documentation can be found at https://hexdocs.pm/scruffy.

Development

gleam test    # Run the tests. The integration suite (test/scruffy_integration_test.gleam)
              # calls the live Scryfall API via gleam_httpc, so it needs network access and
              # only runs on the Erlang target -- `gleam test --target javascript` skips it.
gleam format  # Format the source
Search Document