Introdução
Rotas
As rotas são mantidas no arquivo lib/..._web/router.ex
.
# router.exscope "/api", RocketpayWeb dopipe_through :apiget "/", WelcomeController, :indexend
Controllers
Os controllers são mantidos dentro de lib/..._web/controllers
Exemplo de um controller:
# welcome_controller.exdefmodule RocketpayWeb.WelcomeController douse RocketpayWeb, :controllerdef index(conn, _params) dotext(conn, 'Welcome to the Rocketpay API')endend
Interação com o Elixir
Para interagir com o Elixir via terminal, basta rodar:
iex -S mix
Pattern Matching
No Elixir, o sinal de =
não realiza, necessariamente, atribuições como em outras linguagens, e sim faz validações e avalia se a condição dá um match conforme esperado.
# lib/rocketpay/numbers.exdefmodule Rocketpay.Numbers do # Definição do módulo "Numbers"def sum_from_file(filename) do # Função que realiza a soma de acordo com um arquivofile = File.read("#{filename}.csv") # Atribuição de leitura de arquivo numa variável "file"handle_file(file) # Função que lida com este arquivo, setada abaixoenddefp handle_file({:ok, file}), do: file # Caso a tupla retorne um parâmetro "ok" seguido do conteúdo do arquivo, cairá nessa condiçãodefp handle_file({:error, _reason}), do: {:error, "Invalid file"} ## Caso a tupla retorne um parâmetro "erro" seguido do erro, cairá nessa condiçãoend
Pipe Operator
Com o Pipe Operator, é possível realizar o mesmo bloco de código com uma sintaxe mais elegante.
# lib/rocketpay/numbers.exdefmodule Rocketpay.Numbers dodef sum_from_file(filename) do"#{filename}.csv" # Obtém a string do nome do arquivo|>File.read() # Lê o arquivo. Com o Pipe Operator, o primeiro argumento da função é implicito e será atribuido o valor acima|>handle_file() # Função que lida com o arquivo, também com o primeiro argumento sendo implicitoenddefp handle_file({:ok, file}), do: filedefp handle_file({:error, _reason}), do: {:error, "Invalid file"}end
Testes
# test/rocketpay/numbers_test.exsdefmodule Rocketpay.NumbersTest do # Nome do módulo sequenciado por "Test"use ExUnit.Case # Explicitar que é um testealias Rocketpay.Numbers # Apelido do módulodescribe "sum_from_file/1" do # Nome da função testada / Número de argumentos que a função recebetest "When there is a file with the given name, returns the sum of numbers" do # Descrição do testeresponse = Numbers.sum_from_file("numbers")expected_response = {:ok, %{result: 37}}assert response == expected_responseendtest "When there is no file with the given name, returns an error" doresponse = Numbers.sum_from_file("error")expected_response = {:error, %{message: "Invalid file"}}assert response == expected_responseendendend