#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

#942 in #generator

Download history 251/week @ 2024-09-23 44/week @ 2024-09-30 119/week @ 2024-10-07 117/week @ 2024-10-14 88/week @ 2024-10-21 148/week @ 2024-10-28 23/week @ 2024-11-04 19/week @ 2024-11-11 52/week @ 2024-11-18 119/week @ 2024-11-25 292/week @ 2024-12-02 203/week @ 2024-12-09

668 downloads per month
Used in 4 crates (via golem-service-base)

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
~38K SLoC