feviskus
Hello there,
I am currently working on my first elixir-project which has a bit more business-logic and is not only CRUD.
I want to apply OTP/concurrency in a useful way, and a book-search aggregator seems to be a good use-case.
Currently I have a prototype implementation for a book-store which I scrape to extract the results (btw, Floki is surprisingly fast! At least it feels faster than python).
The pipe looks like this:
@behaviour Book4Less.Searches.SearchBookBehaviour
def search_books(query = %Query{} \\ %Query{title: "Elixir"}) do
query
|> build_url() # returns a string
|> execute_request() # returns a HTTPoison.request
|> validate_response!() # returns a html-string
|> extract_books() # returns a list of %Book{}
end
Questions
-
These functions are temporally-coupled, e.g.
build_url/1andexecute_request/1- because I need to set the url before I send aHTTP-request…
How to express this coupling best? Just makingexecute_request/1callbuild_url/1? -
So this pipeline deals with
string,HTTP,HTMLand thedomain-object Book- all levels of abstractions & different topics. Would u unify the return values to e.g. a%Search{}struct?
Trending in Questions
Other Trending Topics
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
- #blog-post
- #phoenix_html
- #iex
- #graphql
- #ai
- #genstage
- #elixirconf-us
- #websockets
- #supervisor
- #advent-of-code
- #distillery
- #processes
- #api
- #forms
- #metaprogramming
- #security
- #hex










First 4 of 4 Posts
kip
I think this would be nicely expressed in a
withclause since you are subject to errors at each stage of the pipeline and therefore would want to exit the pipeline if an error is detected. So as an example:Noting that if at any stage the patterns do not match, the
withclause will exit with the non-matching return.With this approach I would likely delegate
validate_response/1to be called withinexecute_request/1sincewithis best used to describe the happy path. So this time with explicit error management:Then for
execute_request/1:feviskus
Thanks to your answer I gained some knowledge about the concept of
happy pathand error-handling!One thing:
IMHO the code using the
withstatement is not really as expressive/pretty as a normal pipeline. Do you know some approaches which handle that?kip
At some point your expressive pipeline will have to deal with errors since you have functions with side affects (like external requests) so I’m not sure its the right measure of success.
However perhaps the OK library by @Crowdhailer would reflect your tastes more?
peerreynders
FYI: exceptional