Sha256: c0f0795af227c90720151e72626587d64f0b71274b4dd1b0fbe15e3146aaf019
Contents?: true
Size: 1.27 KB
Versions: 2
Compression:
Stored size: 1.27 KB
Contents
# typed: false require 'sorbet-runtime' module SorbetRails::PluckToTStruct extend T::Sig sig { type_parameters(:U). params( ta_struct: ITypeAssert[T.type_parameter(:U)], associations: T::Hash[Symbol, String], ). returns(T::Array[T.type_parameter(:U)]) } def pluck_to_tstruct(ta_struct, associations: {}) tstruct = ta_struct.get_type if !(tstruct < T::Struct) raise UnexpectedType.new("pluck_to_tstruct expects a tstruct subclass, given #{tstruct}") end tstruct_keys = tstruct.props.keys associations_keys = associations.keys invalid_keys = associations_keys - tstruct_keys if invalid_keys.any? raise UnexpectedAssociations.new("Argument 'associations' contains keys that don't exist in #{tstruct}: #{invalid_keys.join(", ")}") end pluck_keys = (tstruct_keys - associations_keys) + associations.values # loosely based on pluck_to_hash gem # https://github.com/girishso/pluck_to_hash/blob/master/lib/pluck_to_hash.rb keys_one = pluck_keys.size == 1 pluck(*pluck_keys).map do |row| row = [row] if keys_one value = Hash[tstruct_keys.zip(row)] tstruct.new(value) end end class UnexpectedType < StandardError; end class UnexpectedAssociations < StandardError; end end
Version data entries
2 entries across 2 versions & 1 rubygems
Version | Path |
---|---|
sorbet-rails-0.7.2 | lib/sorbet-rails/rails_mixins/pluck_to_tstruct.rb |
sorbet-rails-0.7.1 | lib/sorbet-rails/rails_mixins/pluck_to_tstruct.rb |