Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 18 additions & 1 deletion spec/03_result_for_api_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,24 @@

RSpec.describe 'Result for API' do
def result_for_api(status, api)
# TODO
success = api.is_a?(Hash) ? api[:success] : nil
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Je pense en vrai que tu pourrais défaulter sur true et complètement ignorer le cas nil

L'exercise était pensé pour que result_for_api ne soit que un simple case in, mais si on se permet effectivement cette assignation avant, on pourrait aussi directement prendre en compte le status dans la même étape, ce qui donnerait:

success = (api.is_a?(Hash) && api[:success]) || status == 200

(Même si à nouveau, ca autoriserait a avoir un status 500 qui a un success: true, mais bon, en dehors des cas d'exemple).

Du coup, ton case in se simplifie pas mal.


case [status, api, success]
in [200, {}, nil]
Result::Success.new(nil)
in [200, Hash, false]
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Vu que c'est le seul cas ou tu vérifies vraiment success, tu pourrais aussi ne pas le prendre dans ton pattern matching et utiliser un if guard (que j'ai pas présenté par manque de temps):

in [200, Hash] if success == false

Result::Failure.new([])
in [200, Hash, nil]
Result::Success.new(api[:payload] || api.except(:success))
in [200, Hash, true]
Result::Success.new(api[:payload] || api.except(:success))
Comment on lines +14 to +17
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Du coup, vu que tu as deux fois le même bloc et pas d'assignation de variables, tu peux dé-dupliquer avec in [200, Hash, nil | true], ou alors, vu que tu as déjà élidé le cas false, juste faire in [200, Hash, _] (même si c'est pas exactement identique, vu que ca va alors prendre toute ce qui ne serait pas booléen, mais c'est anectotique ici).

Tu peux aussi pousser le matching pour te débarasser de success et de-nester le payload si besoin:

in [200, { success:, payload:, **nil }]
  Result::Success.new(payload)
in [200, { success:, **payload }]
  Result::Success.new(payload)
in [200, { payload:, **nil }]
  Result::Success.new(payload)
in [200, { **payload }]
  Result::Success.new(payload)

Après c'est pousser ça au maximum.

in [500, {}, nil]
Result::Failure.new([])
in [500, String, nil]
Result::Failure.new([api])
in [500, Hash, nil]
Result::Failure.new(api.values.flatten)
end
end

context 'status OK' do
Expand Down