Получение синтаксической ошибки: ожидание токена "EOF", а не "end" и не может понять, почему

Итак, я пытаюсь реализовать способ добавления миграций базы данных без ORM/ODM для моей базы данных SQLite3, и ошибка, которую я получаю (syntax error: expecting token 'EOF', not 'end') для этого кода:

src/project/database/migration/migrations/1.cr:

require "../migration"

module Project
  ver = 1
  migration = Migration.new ver

  migration.register_up |db| do
    db.exec "create table version (version int)"
    db.exec "insert into version values (?)", ver
  end

  migration.register_down |db| do
    db.exec "drop table version"
  end

  Migrations[ver] = migration
end

Я не вижу никаких непосредственных проблем с синтаксисом. Этот файл импортирует следующий файл, потому что ему нужен класс и строка Migrations = [] of Migration:

src/project/database/migration/migration.cr:

require "db"
require "sqlite3"

module Project

  Migrations = [] of Migration

  class Migration
    def initialize(@version : Int)
    end

    # Registers a callback that will be called when the `up`-method is called.
    # The callback must return either `true` for a successful migration,
    # or `false` for a failed migration. If an `up` migration has
    # failed, the `down` migration will be called to restore the database
    # back to its previous state.
    # The callback will receive an instance of `DB::Database`
    #
    # Example:
    #
    # ```
    # migration = Migration.new(1)
    #
    # migration.register_up |db| do
    #   # Advance migration
    # end
    #
    # migration.register_down |db| do
    #   # Recede migration
    # end
    # ```
    def register_up(&block : (DB::Database) -> Bool)
      @up = block
    end

    # Registers a callback that will be called when the `down`-method is called.
    # See the `register_up` method for more information
    def register_down(&block : (DB::Database) -> Bool)
      @down = block
    end

    # Advances DB to the next version
    def up(conn : DB::Database)
      result = @up.call(conn)
      unless result
        # Failed migration, rollback
        @down.call(conn)
        raise Exception.new(`Failed to migrate database to version: #{@version}. Rolling back.`)
      end
    end

    # Recedes DB to the previous version
    def down(conn : DB::Database)
      result = @down.call(conn)
      unless result
        # Failed migration, rollback
        @up.call(conn)
        raise Exception.new(`Failed to migrate database to version: #{@version - 1}. Rolling back.`)
      end
    end
  end

end

Есть идеи?

1 ответ

Решение

Синтаксическая ошибка здесь:

migration.register_up |db| do
  # ...
end

Должно быть:

migration.register_up do |db|
  # ...
end

И то же самое в register_down,

См. Раздел "Выход аргументов" в разделе " Блоки и процессы".

Другие вопросы по тегам