def enforce_types(*types)
      sttm = SourceToTargetMap.new(df, source_metadata: fields)
      fields.keys.each do |field|
        next unless (types.size == 0 || types.include?(fields[field][:type])) && df.vectors.include?(field)
        begin
          sttm.source(field).target(field).transform(Remi::Transform::EnforceType.new).execute
        rescue StandardError => err
          raise ArgumentError, "Field '#{field}': #{err.message}"
        end
      end

      self
    end
def enforce_types(*types)
      sttm = SourceToTargetMap.new(df, source_metadata: fields)
      fields.keys.each do |field|
        next unless (types.size == 0 || types.include?(fields[field][:type])) && df.vectors.include?(field)
        begin
          sttm.source(field).target(field).transform(Remi::Transform::EnforceType.new).execute
        rescue StandardError => err
          raise ArgumentError, "Field '#{field}': #{err.message}"
        end
      end

      self
    end
Enforces the types defined in the field metadata.  Throws an
 error if a data element does not conform to the type.  For
 example, if a field has metadata with type: :date, then the type
 enforcer will convert data in that field into a date, and will
 throw an error if it is unable to parse any of the values.

 @param types [Array<Symbol>] a list of metadata types to use to enforce.  If none are given,
   all types are enforced.
 @return [self]