#web-framework #macro #orm #featured #path #gotcha

macro gotcha_macro

gotcha 网络框架宏

10个版本

0.1.11 2023年10月31日
0.1.10 2023年8月10日
0.1.5 2023年6月30日
0.1.4 2023年2月22日
0.1.0 2023年1月15日

1703过程宏

每月35次下载
gotcha 中使用

MIT 许可证

26KB
634

gotcha

提供特色网络框架

旨在

  • actix-web 的所有功能
  • 自动生成swagger API
  • 内置消息机制
  • 基于环境的配置系统,支持环境解析器 ${ANY_ENV_VAR} 和路径变量 ${app.database.name}yaac 支持
  • 日志系统
  • 可选Prometheus集成
  • 基于sqlx的魔法ORM
  • 基于cron的任务系统

开始使用

Cargo.toml 中添加依赖项

gotcha = {version = "0.1"}
tokio = {version = "1", features = ["macros", 'rt-multi-thread']}
serde = {version="1", features=["derive"]}
use gotcha::{get, App, GotchaAppWrapperExt, GotchaCli, HttpServer, Responder};
use serde::Deserialize;

#[get("/")]
pub async fn hello_world() -> impl Responder {
    "hello world"
}

#[derive(Debug, Deserialize, Clone)]
struct Config {}

#[tokio::main]
async fn main() {
    GotchaCli::<_, Config>::new()
        .server(|config| async move {
            HttpServer::new(|| {
                App::new()
                    .into_gotcha()
                    .service(hello_world)
                    .data(config)
                    .done()
            })
            .bind(("127.0.0.1", 8080))
                .unwrap()
                .run()
                .await;
        })
        .run()
        .await
}

Conservator ORM

Conservator ORM基于sqlx,目前仅支持postgres

#[derive(Debug, Deserialize, Serialize, Domain, FromRow)]
#[domain(table = "users")]
pub struct UserDomain {
    #[domain(primary_key)]
    pub id: Uuid,
    pub username: String,
    pub email: String,
    pub password: String,
    pub role: UserRole,
    pub create_at: DateTime<Utc>,
    pub last_login_at: DateTime<Utc>,
}

由结构体派生的 Domain 会自动生成方法,例如

  • find_by_id 返回可选实体
  • fetch_one_by_id 返回实体或引发异常
  • fetch_all 返回所有实体
  • create 通过传递 Createable 到表中插入
#[derive(Debug, Deserialize, Serialize, Creatable)]
pub struct NewUser {
    pub username: String,
    pub email: String,
    pub password: String,
}

Createable 意味着它可以由魔法ORM执行,使用 UserDomain::create(NewUser{...}) 在用户表中创建新用户。

#[sql] 还提供了一些方便的方式来编写自定义SQL查询

use conservator::sql;

impl UserService {
    
    #[sql(find)]
    pub async fn find_user<E>(email: &str, executor: E) -> Result<Option<UserEntity>, Error> {
        "select * from users where email = :email"
    }
}

请注意,我们使用 SQL 中的参数 :email 而不是 sqlx 的 $1,它可以在无需修改的情况下在原生 SQL 执行工具中使用,如 IDEA。

依赖项

~19–30MB
~550K SLoC