def result_handler(result) case result when Success, Some puts 'success, user created' when Failure { |message, _| message == :http_error } puts "HTTP request error, #{result.failure[2]}" when Failure { |message, _| message == :validation_error } puts "validation error, #{result.failure[2]}" when Failure(ROM::Error) puts 'User not created' end end def save_user_from_url(url, params) http.get(url, params) .bind { |body| validator.call(body).to_result } .bind { |payload| Try(ROM::Error) { (user_repository.create(payload) } } .fmap { |user| NotificationWorker.perform_async(user.id) } end result_handler save_user_from_url('site.com/posts/1', option: 1) # => HTTP request error result_handler save_user_from_url('site.com/users/1', option: :invalid) # => validation Error result_handler save_user_from_url('site.com/users/1', option: :dublicated) # => persistance Error result_handler save_user_from_url('site.com/users/1', option: :valid) # => 'success, user created'