Skip to content

Commit e8c8eca

Browse files
committed
it responds to echo
1 parent 41ff506 commit e8c8eca

File tree

4 files changed

+36
-5
lines changed

4 files changed

+36
-5
lines changed

.gitignore

+5
Original file line numberDiff line numberDiff line change
@@ -22,3 +22,8 @@ erl_crash.dump
2222
# Ignore package tarball (built via "mix hex.build").
2323
redex-*.tar
2424
.elixir_ls/
25+
26+
dump.rdb
27+
Makefile
28+
tester
29+
spawn_redis_server.sh

lib/command.ex

+8-5
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,16 @@
11
defmodule Redex.Command do
2-
@crlf "\r\n"
2+
import Redex.RESPEncoder
33
@invalid_command_message "Command invalid or not implemented"
44

55

6-
def execute([command | _args]) do
6+
def execute([command | args]) do
77
case command |> String.upcase do
8-
"COMMAND" -> "+OK" <> @crlf
9-
"PING" -> "+PONG" <> @crlf
10-
_ -> raise @invalid_command_message
8+
"COMMAND" -> encode({:simple_str, "OK"})
9+
"PING" -> encode({:simple_str, "PONG"})
10+
"ECHO" -> encode({:simple_str, Enum.at(args, 0)})
11+
_ ->
12+
IO.inspect [command] ++ args
13+
raise @invalid_command_message
1114
end
1215
end
1316
end

lib/resp_encoder.ex

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
defmodule Redex.RESPEncoder do
2+
@crlf "\r\n"
3+
4+
def encode(data) when is_list(data), do: "*#{Enum.count(data)}#{@crlf}" <> encode_array(data, "")
5+
def encode({:simple_str, value}), do: "+#{value}#{@crlf}"
6+
def encode({:error_str, value}), do: "-#{value}#{@crlf}"
7+
def encode({:integer, value}), do: ":#{value}#{@crlf}"
8+
def encode({:bulk_str, nil}), do: "$-1#{@crlf}"
9+
def encode({:bulk_str, value}), do: "$#{String.length(value)}#{@crlf}#{value}#{@crlf}"
10+
def encode(_), do: raise "Unable to encode response"
11+
12+
defp encode_array([head | tail], accumulator), do: encode_array(tail, accumulator <> encode(head))
13+
defp encode_array([], accumulator), do: accumulator
14+
end

test/resp_encoder_test.exs

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
defmodule RESPEncoderTest do
2+
use ExUnit.Case
3+
import Redex.RESPEncoder
4+
5+
test "it can encode simple string" do
6+
assert encode({:simple_str, "OK"}) == "+OK\r\n"
7+
end
8+
9+
end

0 commit comments

Comments
 (0)