#traits #generator #macro #proc-macro

macro conditional-trait-gen

Trait implementation generator macro supporting conditional methods

2 releases

0.4.1 Sep 27, 2024
0.4.0 Sep 27, 2024

#1184 in Rust patterns

Download history 285/week @ 2024-09-27 57/week @ 2024-10-04 155/week @ 2024-10-11 117/week @ 2024-10-18 137/week @ 2024-10-25

469 downloads per month

MIT/Apache

46KB
733 lines

conditional_trait_gen

A fork of the trait_gen crate, adding support for specializing trait methods based on the type it is generated for.

Introduces a #[when] attribute that can be used on methods of the trait implementation to customize the method based on the actual type used by the generator.

Example:

 #[async_trait]
trait Repo {
    async fn create(&self, param: String) -> Result<u64, String>;
    async fn read(&self, id: u64) -> Result<String, String>;
    async fn update(&self, id: u64, param: String) -> Result<(), String>;
    async fn delete(&self, id: u64) -> Result<(), String>;
}

#[trait_gen(DB -> sqlx::sqlite::Sqlite, sqlx::mysql::MySql, sqlx::postgres::Postgres)]
#[async_trait]
impl Repo for sqlx::Pool<DB> {
    async fn create(&self, param: String) -> Result<u64, String> {
        // Common implementation
        todo!()
    }

    async fn read(&self, id: u64) -> Result<String, String> {
        // Common implementation
        todo!()
    }

    #[when(sqlx::sqlite::Sqlite -> update)]
    async fn update_sqlite(&self, id: u64, param: String) -> Result<(), String> {
        // SQLite specific implementation
        todo!()
    }

    #[when(sqlx::mysql::MySql -> update)]
    async fn update_mysql(&self, id: u64, param: String) -> Result<(), String> {
        // MySQL specific implementation
        todo!()
    }

    #[when(sqlx::postgres::Postgres -> update)]
    async fn update_postgres(&self, id: u64, param: String) -> Result<(), String> {
        // Postgres specific implementation
        todo!()
    }

    async fn delete(&self, id: u64) -> Result<(), String> {
        // Common implementation
        todo!()
    }
}

Dependencies

~1.5MB
~37K SLoC