Ookma-Kyi
Iex help command not working
I am currently enrolled in the Pragmatic Studio Elixir & OTP course and have just completed the section on module attributes. I have the following code:
defmodule Servy.Handler do
@moduledoc "Handles HTTP requests"
@pages_path Path.expand("../../pages", __DIR__)
@doc "Transforms the request into a response."
def handle(request) do
request
|> parse
|> rewrite_path
|> log
|> route
|> track
|> format_response
end
def emojify(%{status: 200} = conv) do
body = ":) " <> conv.resp_body <> " :)"
%{conv | resp_body: body}
end
def emojify(conv), do: conv
def track(%{status: 404, path: path} = conv) do
IO.puts("Warning: #{path} is on the loose!")
conv
end
@doc "Logs 404 requests"
def track(conv), do: conv
def rewrite_path(%{path: "/wildlife"} = conv) do
%{conv | path: "/wildthings"}
end
def rewrite_path(%{path: "/bears?id=" <> id} = conv) do
%{conv | path: "/bears/#{id}"}
end
def rewrite_path(conv), do: conv
def log(conv), do: IO.inspect(conv)
def parse(request) do
# TODO Parse the request string into a map
[method, path, _] =
request
|> String.split("\n")
|> List.first()
|> String.split(" ")
%{method: method, path: path, resp_body: "", status: nil}
end
def route(%{method: "GET", path: "/wildthings"} = conv) do
%{conv | status: 200, resp_body: "Bears, Lions, Tigers"}
end
def route(%{method: "GET", path: "/bears"} = conv) do
%{conv | status: 200, resp_body: "Teddy, Smokey, Paddington"}
end
def route(%{method: "GET", path: "/bears/new"} = conv) do
@pages_path
|> Path.join("form.html")
|> File.read()
|> handle_file(conv)
end
def route(%{method: "GET", path: "/bears/" <> id} = conv) do
%{conv | status: 200, resp_body: "Bear #{id}"}
end
def route(%{method: "GET", path: "/pages/" <> file} = conv) do
Path.expand("../../pages", __DIR__)
|> Path.join(file <> ".html")
|> File.read()
|> handle_file(conv)
end
def route(%{method: "GET", path: "/about"} = conv) do
Path.expand("../../pages", __DIR__)
|> Path.join("about.html")
|> File.read()
|> handle_file(conv)
end
def route(%{method: "DELETE", path: "/bears/" <> _id} = conv) do
%{conv | status: 403, resp_body: "Deleting a bear is forbidden!"}
end
def route(%{path: path} = conv) do
%{conv | status: 404, resp_body: "No #{path} here"}
end
def handle_file({:ok, content}, conv) do
%{conv | status: 200, resp_body: content}
end
def handle_file({:error, :enoent}, conv) do
%{conv | status: 404, resp_body: "File not found"}
end
def handle_file({:error, reason}, conv) do
%{conv | status: 500, resp_body: "File Error: #{reason}"}
end
def format_response(conv) do
# TODO: Use values in the map to create an HTTP response string:
"""
HTTP/1.1 #{conv.status} #{status_reason(conv.status)}
Content-Type: text/html
Content-Length: #{byte_size(conv.resp_body)}
#{conv.resp_body}
"""
end
defp status_reason(code) do
%{
200 => "OK",
201 => "Created",
401 => "Unauthorized",
403 => "Forbidden",
404 => "Not Found",
500 => "Internal Server Error"
}[code]
end
end
request = """
GET /wildthings HTTP/1.1
Host: example.com
User-Agent: ExampleBrowser/1.0
Accept: */*
"""
response = Servy.Handler.handle(request)
IO.puts(response)
request = """
GET /bears HTTP/1.1
Host: example.com
User-Agent: ExampleBrowser/1.0
Accept: */*
"""
response = Servy.Handler.handle(request)
IO.puts(response)
request = """
GET /bigfoot HTTP/1.1
Host: example.com
User-Agent: ExampleBrowser/1.0
Accept: */*
"""
response = Servy.Handler.handle(request)
IO.puts(response)
request = """
GET /bears/1 HTTP/1.1
Host: example.com
User-Agent: ExampleBrowser/1.0
Accept: */*
"""
response = Servy.Handler.handle(request)
IO.puts(response)
request = """
GET /wildlife HTTP/1.1
Host: example.com
User-Agent: ExampleBrowser/1.0
Accept: */*
"""
response = Servy.Handler.handle(request)
IO.puts(response)
request = """
GET /bears?id=1 HTTP/1.1
Host: example.com
User-Agent: ExampleBrowser/1.0
Accept: */*
"""
response = Servy.Handler.handle(request)
IO.puts(response)
request = """
GET /about HTTP/1.1
Host: example.com
User-Agent: ExampleBrowser/1.0
Accept: */*
"""
response = Servy.Handler.handle(request)
IO.puts(response)
request = """
GET /bears/new HTTP/1.1
Host: example.com
User-Agent: ExampleBrowser/1.0
Accept: */*
"""
response = Servy.Handler.handle(request)
IO.puts(response)
However, when I try to see the generated documentation as an exercise, I get an error:
Any ideas?
Most Liked
sodapopcan
To be clear, .ex is not an executable, it’s just an elixir file. .beam are the bytecode files.
In short, modules in iex are loaded into memory so not compiled with docs. I’m not sure if there is a way to do so or not. If you have a mix project, though, and load it in with iex -S mix then you’ll be able to use h.
1
garrison
How are you compiling it? If you are doing c("handler.ex") in iex it still defaults to in-memory regardless of whether it’s a .exs file.
1
garrison
Last Post!
sodapopcan
Popular in Questions
lets say i have a sample like
a = 20; b = 10;
if (a > b) do
{:ok, "a"}
end
if (a < b) do
{:ok, b}
end
if (a == b) do
{:ok, "equa...
New
For some reason my phoenix channels are working for me in my local dev environment, but as soon as I deploy via Docker, I get a 403 error...
New
I believe there are people here who are dealing with CSV files import on the daily basis, and since Excel is a really popular tool there ...
New
I have a another noob question about loop. Since elixir is immutable, while loop is not directly possible.
total = 10
while total != 0
...
New
Good day to you all.
I have been struggling to get a query involving like and ilike to work.
Can anyone assist me on this, please?
pro...
New
Currently suffering from paralysis by [HTTP client] analysis. This is rather unusual in Elixirland as there tends to be consensus on the ...
New
After calling mix ecto.create I get this error:
17:00:32.162 [error] GenServer #PID<0.412.0> terminating
** (Postgrex.Error) FATAL...
New
Other popular topics
Hi guys, i’m new in the Elixir world, and i have to say, that i love it!
i’m having some problem to understand anonymous functions with ...
New
I wrote this comment on r/haskell, and it’s not popular there. :wink: But I think I’m on to something…
Haskell reminds me of Java, and e...
New
Seen any cool LiveView demos, sample apps or examples? Please post them here! :003:
New
I am trying to start a new phoenix project with elixir 1.9, but mix phx.new does not work. It says that ** (Mix) The task "phx.new" could...
New
i’m a new one to elixir
which editor can i use
vs code? or atom?
Thanks! :smiley:
New
Posting this to see if we can make things easier for people to get into Neovim. If you use Neovim and have a favourite distro please let ...
New
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #deployment
- #library
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #channels
- #elixirconf
- #exunit
- #discussion
- #code-sync
- #javascript
- #podcasts
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixir-ls
- #phoenix_html
- #iex
- #blog-post
- #graphql
- #genstage
- #ai
- #websockets
- #supervisor
- #elixirconf-us
- #advent-of-code
- #distillery
- #processes
- #forms
- #api
- #metaprogramming
- #security
- #hex










