Bom pra te ajudar melhor seria interessante mostrar o seu projeto, você está usando sqlx, diesel ou fazendo tudo na mão?

Qual o seu problema com o async-trait? Por que acha que ele fere a arquitetura hexagonal?

Eu devo fazer um vídeo num futuro sobre actix, axum, ntex e loco.rs se falar sua dúvida talvez eu já consiga incluir no vídeo =D

Tem essa documentação que é antiga, mas pode te ajudar também. https://rust-on-nails.com/docs/

Estou utilizando sqlx com postgres.

Exemplo simples de estrutura do projeto:

src/application/repositories/company_repository.rs

use crate::core::entities::company::Company;
use async_trait::async_trait;

#[async_trait]
pub trait CompanyRepository {
    async fn update_or_create(&self, company: Company) -> Result<(), String>;
    async fn get_all(&self) -> Result<Vec<Company>, String>;
}

src/adapters/repositories/postgres_company_repository.rs

use crate::application::repositories::company_repository::CompanyRepository;
use async_trait::async_trait;
use sqlx::{Executor, PgPool};

#[async_trait]
impl CompanyRepository for PostgresCompanyRepository {
    async fn update_or_create(&self, company: Company) -> Result<(), String> {
        let model = CompanyModel::from(company);
        let query = sqlx::query(
            "
                INSERT INTO companies (id, social_reason, cnpj)
                VALUES ($1, $2, $3)
                ON CONFLICT (id) DO UPDATE SET social_reason = $2, cnpj = $3
                ",
        )
        .bind(model.id)
        .bind(model.social_reason)
        .bind(model.cnpj);
        self.get_pool()
            .execute(query)
            .await
            .map_err(|e| e.to_string())?;
        Ok(())
    }
}

O problema em questão é que a async_trait está em um arquivo que teoricamente deveria ter apenas dependência do core, sem dependência de third_party.

Mas não encontrei outra opção senão colocar ela aqui, o que me parece errado.

Por isso estou perguntando se existe uma maneira de fazer isso sem quebrar o padrão de dependência do projeto ou devo considerar essa crate como parte da linguagem Rust, porque sem ela ficamos limitados a criar traits síncronas.

A arquitetura deveria permitir essa dependência no arquivo de repositório? Isso que eu considero uma ferida, estou implementando a arquitetura de forma errada?

hoje eu acredito que ou voce aceita ou você cria um dyn trait e lidar dentro com o seu projeto com os desafios que a lib implementa. no roadmap pelo que lembro tem algo pra resolver isso. Mas, por hora ou implementa com dyn ou usa essa trait.
Beleza, acho que vou aceitar mesmo, muito obrigado!
nois e da uma olhada nos proximos releases isso deve entrar em breve