Module: HttpResource::ValueObject
- Defined in:
- lib/http_resource/value_object.rb
Overview
Mixin for response value objects, designed to pair with Ruby’s Data.define. It gives a class a tolerant ‘.from(payload)` that:
- returns nil for a nil payload (so an empty 2xx -> nil, never a ghost),
- unwraps a top-level { "data" => {...} } envelope if present,
- normalises string OR symbol keys,
then hands the inner hash to ‘build` (or the Data.define member names, when no `build` is defined) so missing keys arrive as nil instead of raising.
Contact = Data.define(:email, :name) do
extend HttpResource::ValueObject
end
Contact.from("data" => { "email" => "a@b.se" }) # => #<data Contact email="a@b.se", name=nil>
Contact.from(nil) # => nil
Resource methods should still guard ‘data && Contact.from(data)` so the caller never receives a ghost object from an empty body.
Instance Method Summary collapse
Instance Method Details
#from(payload) ⇒ Object
21 22 23 24 25 26 |
# File 'lib/http_resource/value_object.rb', line 21 def from(payload) return nil if payload.nil? data = unwrap(payload) respond_to?(:build) ? build(data) : new(**slice_members(data)) end |