Skip to content

Instantly share code, notes, and snippets.

View DiscordBlog's full-sized avatar
🐹
Running through robohamster wheels!

Discord Blog DiscordBlog

🐹
Running through robohamster wheels!
View GitHub Profile
@DiscordBlog
DiscordBlog / worker_process_demo.ex
Created October 24, 2023 22:44 — forked from ypisetsky/worker_process_demo.ex
Rough code for how to use a worker process
defmodule Guild do
use GenServer
def execute_in_worker(worker_code, after_worker_callback, state) do
mini_state = create_state_for_worker(state)
main_process = self()
spawn_link(fn ->
result = worker_code.(mini_state)
send(main_process, {:worker_completed, after_worker_callback, result})
end)
@DiscordBlog
DiscordBlog / discord_test.exs
Created December 3, 2021 21:48 — forked from ihumanable/discord_test.exs
Test Skeleton
defmodule Discord.Test do
use ExUnit.Case
describe "send_message/1" do
test "errors on invalid messages" do
# TODO
end
test "errors when message can't be durably stored" do
# TODO
@DiscordBlog
DiscordBlog / discord.ex
Last active December 4, 2021 12:00 — forked from ihumanable/discord.ex
If only Discord were this easy
defmodule Discord do
def send_message(%Message{} = message) do
with :ok <- validate_message(message),
:ok <- save_message(message) do
broadcast_message(message)
end
end
defp validate_message(message) do
with :ok <- validate_author_is_member(message),
@DiscordBlog
DiscordBlog / call_graph.ex
Created December 2, 2021 23:55 — forked from ihumanable/call_graph.ex
Patch Call Graph
assert {:bad, :error} == Discord.send_message(%Message{})
# We start at the Facade
Discord.send_message(%Message{}) {
# The Facade calls the Delegate
Delegate.send_message(message) {
# The Delegate checks if the Server has a patch for send_message/1
Server.delegate(Discord, :send_message, [message]) {
# The Server doesn't, so it calls the Original
Original.send_message(message) {
@DiscordBlog
DiscordBlog / test_output_patch.ex
Created December 2, 2021 23:55 — forked from ihumanable/test_output_patch.ex
Test Output (Patch)
~/src/discord > mix test
...
3 tests, 0 failures
@DiscordBlog
DiscordBlog / discord_test.exs
Created December 2, 2021 23:49 — forked from ihumanable/discord_test.exs
Invalid Message Test Case with Patch
defmodule Discord.Test do
use ExUnit.Case
use Patch
describe "send_message/1" do
test "errors on invalid messages" do
patch(Discord, :validate_message, {:error, :bad})
assert {:error, :bad} == Discord.send_message(%Message{})
end
end
@DiscordBlog
DiscordBlog / discord_original.ex
Created December 2, 2021 23:48 — forked from ihumanable/discord_original.ex
Patch Original for Discord
defmodule Patch.Mock.Original.For.Discord do
alias Patch.Mock.Delegate.For.Discord, as: Delegate
def send_message(%Message{} = message) do
with :ok <- Delegate.validate_message(message),
:ok <- Delegate.save_message(message) do
Delegate.broadcast_message(message)
end
end
@DiscordBlog
DiscordBlog / server.ex
Created December 2, 2021 23:48 — forked from ihumanable/server.ex
Patch.Mock.Server delegate/3 simplified
def delegate(module, name, arguments) do
server = Naming.server(module)
case GenServer.call(server, {:delegate, name, arguments}) do
{:ok, reply} ->
reply
:error ->
original = Naming.original(module)
apply(original, name, arguments)
@DiscordBlog
DiscordBlog / discord_delegate.ex
Created December 2, 2021 23:46 — forked from ihumanable/discord_delegate.ex
Patch Delegate for Discord
defmodule Patch.Mock.Delegate.For.Discord do
alias Patch.Mock.Server
def send_message(%Message{} = message) do
Server.delegate(Discord, :send_message, [message])
end
def validate_message(message) do
Server.delegate(Discord, :validate_message, [message])
end
@DiscordBlog
DiscordBlog / discord_facade.ex
Created December 2, 2021 23:45 — forked from ihumanable/discord_facade.ex
Patch Facade for Discord
defmodule Discord do
alias Patch.Mock.Delegate.For.Discord, as: Delegate
def send_message(%Message{} = message) do
Delegate.send_message(message)
end
end