Pular para o conteúdo

Referência da API

Sete endpoints JSON com a linguagem inteira: sintaxe, 1873 símbolos, 60 comandos, 177 códigos de erro e o inventário. Gerados do código-fonte, com CORS aberto.

Tudo que esta documentação mostra está disponível como JSON, servido do próprio site, com Access-Control-Allow-Origin: *. Serve para gerar realce de sintaxe, autocompletar num editor que não fale LSP, uma folha de consulta, um bot, ou um site como este.

bash
curl -s https://dataforge-lang.vercel.app/api/index.json
json
{
  "nome": "DataForge",
  "versao": "1.0.0",
  "descricao": "API pública da linguagem: sintaxe, biblioteca, comandos e conteúdos.",
  "documentacao": "https://dataforge-lang.vercel.app/docs",
  "rotas": {
    "sintaxe":    "/api/sintaxe.json",
    "embutidas":  "/api/embutidas.json",
    "modulos":    "/api/modulos.json",
    "comandos":   "/api/comandos.json",
    "erros":      "/api/erros.json",
    "conteudos":  "/api/conteudos.json"
  }
}

Os sete endpoints#

EndpointTamanhoO que traz
/api/index.json< 1 KBo índice — comece por aqui
/api/sintaxe.json12 KB81 palavras reservadas, 32 contextuais, 19 operadores, os verbos HTTP e as regras que mais pegam
/api/embutidas.json2 KBas 228 funções globais, sem adopt
/api/modulos.json166 KB71 módulos e 1873 símbolos, com assinatura e resumo de cada um
/api/comandos.json29 KB60 comandos da CLI, em 7 grupos, com opções, exemplos e apelidos
/api/erros.json75 KB177 códigos de erro, com explicação, exemplo que provoca e como corrigir
/api/conteudos.json< 1 KBo inventário: exercícios por módulo, exemplos, pacotes, projetos

`/api/sintaxe.json`#

É o que um realce de sintaxe precisa, e cada palavra vem com o equivalente na linguagem de onde a pessoa vem:

json
{
  "versao": "1.0.0",
  "extensao": ".df",
  "reservadas": [
    { "palavra": "action", "descricao": "declara uma função",
      "equivalente": "def / function" }
  ],
  "contextuais": [
    { "palavra": "abstract", "descricao": "sem implementação; obriga o herdeiro",
      "equivalente": "abstract", "onde": "corpo de blueprint" }
  ],
  "operadores": [
    { "simbolo": ":=", "descricao": "atribuição", "equivalente": "=" }
  ],
  "verbos_http": ["GET", "POST", "PUT", "PATCH", "DELETE", "HEAD", "OPTIONS", "ANY"],
  "regras": ["A indentação é de 4 espaços. Tab é erro de sintaxe.", "…"]
}

A distinção entre reservadas e contextuais importa para quem constrói ferramenta: as 81 primeiras não podem ser nome de variável; as 19 segundas podem, e só viram palavra-chave onde fazem sentido — route, render e server são nomes bons demais para tirar de quem escreve.

O campo onde das contextuais diz exatamente em que contexto ela liga.

`/api/modulos.json`#

O maior dos sete, e o que responde "o que a biblioteca tem":

json
{
  "versao": "1.0.0",
  "total_modulos": 39,
  "total_simbolos": 1490,
  "modulos": [
    {
      "nome": "Arcane.Vitrine",
      "apelidos": ["Painel", "Vitrine"],
      "total": 113,
      "simbolos": [
        { "nome": "abas", "assinatura": "(rotulos)",
          "resumo": "Abas. Devolve um cluster de áreas, uma por rótulo." }
      ]
    }
  ]
}

apelidos é o mesmo módulo por outro nome: adopt Banco e adopt Arcane.Forge carregam o mesmo objeto. Contá-los como módulos diferentes já fez o site anunciar 33 onde havia 29 — por isso a API traz o nome oficial e a lista de apelidos separada.

`/api/erros.json`#

Cada um dos 177 códigos com o que provoca e o que resolve:

json
{
  "codigo": "DF0101",
  "titulo": "Indentacao inconsistente",
  "explicacao": "DataForge usa indentação para delimitar blocos, e aceita apenas espaços…",
  "exemplo": "given x bigger 0:\n    out \"com espacos\"\n\tout \"com tab\"",
  "solucao": "Configure o editor para inserir espaços no lugar de tab…",
  "doc": "primeiros-passos"
}

O campo exemplo é código que provoca aquele erro, e o doc é o caminho relativo da página que explica o assunto — https://dataforge-lang.vercel.app/docs/ + doc.

É o mesmo catálogo que o dataforge explain DF0101 imprime no terminal.

`/api/comandos.json`#

json
{
  "grupo": "Projeto",
  "comandos": [
    {
      "nome": "init",
      "uso": "dataforge init [pasta]",
      "resumo": "Cria forge.toml e o esqueleto do projeto",
      "detalhe": "Escreve o manifesto, a pasta src/ com um main.df e a tests/…",
      "opcoes": [],
      "exemplos": [
        { "comando": "dataforge init", "nota": "aqui mesmo" },
        { "comando": "dataforge init meu-app", "nota": "numa pasta nova" }
      ],
      "apelidos": [],
      "veja": ["new", "info"]
    }
  ]
}

veja liga os comandos entre si — é o que permite montar uma navegação sem decidir à mão o que é relacionado a quê.

Usar: três exemplos que rodam#

Em DataForge#

dataforge
adopt Arcane.Web as Web
adopt Arcane.Serialization as Serde

// 'Arcane.Web' e o CLIENTE; 'Arcane.Http' e o servidor.
r := Web.get("https://dataforge-lang.vercel.app/api/sintaxe.json")
dados := Serde.from_json(r["body"])

out $"{len(dados["reservadas"])} palavras reservadas"

// Cada uma traz o equivalente na linguagem de onde a pessoa vem
cycle p in dados["reservadas"]:
    given p["equivalente"] is not "":
        out $"  {p["palavra"]}{p["equivalente"]}"

No terminal, com jq#

bash
# quantos símbolos tem cada módulo, do maior para o menor
curl -s https://dataforge-lang.vercel.app/api/modulos.json \
  | jq -r '.modulos | sort_by(-.total) | .[] | "\(.total)\t\(.nome)"' \
  | head

# o que fazer com um erro específico
curl -s https://dataforge-lang.vercel.app/api/erros.json \
  | jq -r '.codigos[] | select(.codigo == "DF0401") | .solucao'

# toda opção de um comando
curl -s https://dataforge-lang.vercel.app/api/comandos.json \
  | jq -r '.grupos[].comandos[] | select(.nome == "check") | .opcoes[]'

Em JavaScript, do navegador#

javascript
const base = 'https://dataforge-lang.vercel.app/api';

// O CORS é aberto: dá para chamar de qualquer origem.
const { reservadas, operadores } = await fetch(`${base}/sintaxe.json`)
  .then((r) => r.json());

// Um realce de sintaxe mínimo, com a lista sempre em dia.
const palavras = new RegExp(`\\b(${reservadas.map((p) => p.palavra).join('|')})\\b`, 'g');
const colorido = codigo.replace(palavras, '<b>$1</b>');

Contrato#

MétodoGET. Não há escrita — é um site estático.
Autenticaçãonenhuma. Os dados são públicos e não há cota.
CORSAccess-Control-Allow-Origin: * em todos os sete.
CodificaçãoUTF-8, e o Content-Type diz charset=utf-8.
Cacherevalidação a cada pedido. Um deploy publica dados novos na hora.
Versãotodo arquivo traz versao na raiz — compare com a sua antes de confiar no formato.

O registro de pacotes é outro endereço#

/registry/index.json é o registro que o dataforge add consulta — não faz parte desta API, e tem contrato próprio.

bash
curl -s https://dataforge-lang.vercel.app/registry/index.json | jq '.pacotes | keys'

Ele é uma pasta com index.json e pacotes/*.tar.gz, servida por qualquer host: não há servidor a manter. Os detalhes em Pacotes.

E o OpenAPI, que é outra coisa#

Esta página é a API do site. Se você quer o contrato de uma API que você escreveu em DataForge, o Arcane.API gera OpenAPI 3.1, coleção do Postman, do Insomnia, comandos curl e Markdown — tudo derivado das rotas registradas no seu servidor Kiln.

dataforge
adopt Arcane.API as API

doc := API.openapi(minha_api, {"titulo": "Loja", "versao": "2.0"})

Em OpenAPI, Insomnia e Postman.

Onde continuar#