class Neighbor::Attribute

def cast_value(...)

def cast_value(...)
  new_cast_type.send(:cast_value, ...)
end

def initialize(cast_type:, model:, type:, attribute_name:)

def initialize(cast_type:, model:, type:, attribute_name:)
  @cast_type = cast_type
  @model = model
  @type = type
  @attribute_name = attribute_name
end

def new_cast_type

def new_cast_type
  @new_cast_type ||= begin
    if @cast_type.is_a?(ActiveModel::Type::Value)
      case Utils.adapter(@model)
      when :sqlite
        case @type&.to_sym
        when :int8
          Type::SqliteInt8Vector.new
        when :bit
          @cast_type
        when :float32, nil
          Type::SqliteVector.new
        else
          raise ArgumentError, "Unsupported type"
        end
      when :mariadb
        if @model.columns_hash[@attribute_name.to_s]&.type == :integer
          @cast_type
        else
          Type::MysqlVector.new
        end
      else
        @cast_type
      end
    else
      @cast_type
    end
  end
end