Hello everyone
I’m looking for some feedback on this code I wrote: redirect-checker (I didn’t paste the code here as it’s about 40 lines).
Thanks!
Hello everyone
I’m looking for some feedback on this code I wrote: redirect-checker (I didn’t paste the code here as it’s about 40 lines).
Thanks!
Welcome @manckaert!
Looks good to me. My main metric is whether I can read & understand it quickly, and I could.
mix format is your friend (although, like all friends, I have some disagreements from time to time). It’s good to get into the habit of using it - the community’s eyes are used to running over code formatted in a particular way. There’s only one block of code that got reorganised when I ran it:
redirect_to =
case location_header do
{"Location", loc} -> loc
nil -> nil
end
If this becomes part of a bigger system, you may find passing tuples around gets confusing, in which case upgrade to a map or (better still) a struct.
Also, HTTPoison.get would, I imagine, be quite slow with lots of wait time. If you want to learn a bit more about the power of BEAM, you could have a crack at parallelising. I’m sure there are many articles explaining how - my google-fu turned up a reasonable one as a starting point: Write Unbelievably Clean Concurrent Code in Elixir Using the Task Module | TopTechSkills.com
Thank you @mindok for the welcome and taking a look!
You’re right about the formatting, I come from Python mostly and there black is a lifesaver - especially in a team. I was mostly relying on how Emacs formatted my code but I fixed and issue with elixir-ls and now the section you highlighted gets formatted correctly.
I had already started rewriting it using Tasks as I had already noticed the IO is killing performance when doing the HTTP requests. It’s turning out quite nice but currently the “result collection” is pretty messy ![]()
Thank you again for your time!
have you tried dbg instead of inspect?
I did now
Thanks for pointing that out. I had heard / read about dbg but kept using IO.inspect out of pure habbit. It’s quite useful to see the code line where you called dbg if you have a couple of ‘debug’ statements in your code.
Welcome @manckaert!
Additional to the comments written above, you could split the last function declaration:
# matches `foo,bar,foo` as the third argument should be the same as the first.
# The `to_url` can be seen as an alias and makes the code easier to understand.
def verify_response({redirect_to, from_url, to_url = redirect_to}), do:
%{result: :match, from_url: from_url, to_url: to_url}
# matches `foo,bar,baz`
def verify_response({redirect_to, from_url, to_url}), do:
%{result: :no_match, from_url: from_url, to_url: to_url, redirect_to: redirect_to}
In your code, the function is quite small so it’s easy to digest. This is just to show you a technique you might not know already ![]()
Thanks @BartOtten! I had thought of doing the verification like that as it feels more “elixir - like” but never got it working. Thanks for showing me the correct way ![]()