#migration #file #framework #generic #procedural #proc-macro #fimi

macro fimi_magic

Procedural macros for fimi-rs (generic file migration framework)

2 releases

0.1.3 Nov 3, 2024
0.1.0 Nov 3, 2024

#299 in Procedural macros

Download history 206/week @ 2024-11-02 20/week @ 2024-11-09

226 downloads per month

MIT/Apache

7KB
89 lines

fimi-rs

🚧 Disclaimer: work in progress 🚧

File migrations made easy.

Description

The purpose of this repository is to offer a framework for configuration file migrations, akin to database migrations. Fimi is designed to be generic, handling various file content types (e.g., JSON, YAML) without concern. This crate does not impose any restrictions on the migration itself; it is entirely up to the programmer implementing the migration. The migration code should be able to run independently of this framework.

The fimi crate delivers the core business logic for this framework, while fimi_magic includes procedural macros to support this logic.

Usage

The crate tracks executed migrations by keeping record in a manifest file.

/// see `fimi_example` to explore the complete example

mod migrations {
    /// the migration modules have a name convention of _*datetimeId*_*migration_name*
    mod _20241021212814_init_migration {
        use fimi::Migration;
        pub struct InitMigration;

        impl Migration for InitMigration {
            fn up(&self) -> Result<(), Box<dyn std::error::Error>> {
                // implement this
                Ok(())
            }

            fn down(&self) -> Result<(), Box<dyn std::error::Error>> {
                // implement this
                Ok(())
            }
        }
    }

    use fimi_magic::migrations;

    /// the arguments of this macro are modules
    /// each module should have a public accessible struct with the same name as the migration 
    /// that implements the `fimi::Migration` trait.
    /// (here: InitMigration & AddNewKeyToTestStructs)
    migrations!(
        _20241021212814_init_migration,
        _20241022110124_add_new_key_to_test_structs
    );
}

fn main() {
    let executor = migrations::migrations();

    executor.up();
}

Roadmap

  • interactive up/down with specified migrations (cargo-fimi?)
    • needs dynamically loading of the migration modules when executing from cli (e.g. with cargo fimi) in the project where the migrations exist 🤔
  • scaffold migrations

Similar crates

fimi-rs differs in the fact that the migrations are generic and are not tied to SQL / specific database connections.

No runtime deps