class GraphQL::Schema::Visibility::Migration::RuntimeTypesMismatchError

def compare_results(warden_result, profile_result)

def compare_results(warden_result, profile_result)
  if warden_result.is_a?(Array) && profile_result.is_a?(Array)
    all_results = warden_result | profile_result
    all_results.sort_by!(&:graphql_name)
    entries_text = all_results.map { |entry| "#{entry.graphql_name} (#{entry})"}
    width = entries_text.map(&:size).max
    yes = "    ✔   "
    no =  "        "
    res = "".dup
    res << "#{"Result".center(width)} Warden  Profile \n"
    all_results.each_with_index do |entry, idx|
      res << "#{entries_text[idx].ljust(width)}#{warden_result.include?(entry) ? yes : no}#{profile_result.include?(entry) ? yes : no}\n"
    end
    res << "\n"
  else
    "- Warden returned: #{humanize(warden_result)}\n\n- Visibility::Profile returned: #{humanize(profile_result)}"
  end
end

def humanize(val)

def humanize(val)
  case val
  when Array
    "#{val.size}: #{val.map { |v| humanize(v) }.sort.inspect}"
  when Module
    if val.respond_to?(:graphql_name)
      "#{val.graphql_name} (#{val.inspect})"
    else
      val.inspect
    end
  else
    val.inspect
  end
end

def initialize(method_called, warden_result, profile_result, method_args)

def initialize(method_called, warden_result, profile_result, method_args)
  super(<<~ERR)
    Mismatch in types for `##{method_called}(#{method_args.map(&:inspect).join(", ")})`:
    #{compare_results(warden_result, profile_result)}
    Update your `.visible?` implementation to make these implementations return the same value.
    See: https://graphql-ruby.org/authorization/visibility_migration.html
  ERR
end