use serde::{Deserialize, Serialize};
use silent::prelude::*;
use silent_openapi::{SwaggerUiMiddleware, ToSchema};
use utoipa::OpenApi;
#[derive(Serialize, Deserialize, ToSchema)]
struct User {
id: u64,
name: String,
}
#[derive(Serialize, ToSchema)]
struct ApiResponse {
message: String,
status: String,
}
#[derive(OpenApi)]
#[openapi(
info(
title = "Simple API Demo",
version = "1.0.0",
description = "一个使用Silent框架和OpenAPI的简单示例"
),
components(schemas(User, ApiResponse))
)]
struct ApiDoc;
async fn hello(_req: Request) -> Result<Response> {
let response = ApiResponse {
message: "Hello, Silent OpenAPI!".to_string(),
status: "success".to_string(),
};
Ok(Response::json(&response))
}
async fn get_user(req: Request) -> Result<Response> {
let id: u64 = req.get_path_params("id").unwrap_or(1);
let user = User {
id,
name: format!("User {}", id),
};
Ok(Response::json(&user))
}
async fn health_check(_req: Request) -> Result<Response> {
Ok(Response::text("OK"))
}
#[tokio::main]
async fn main() -> Result<()> {
logger::fmt().init();
println!("🚀 启动简单的OpenAPI示例...");
let swagger_middleware = SwaggerUiMiddleware::new("/swagger-ui", ApiDoc::openapi())
.expect("创建Swagger UI中间件失败");
let routes = Route::new("")
.hook(swagger_middleware) .get(hello) .append(Route::new("health").get(health_check)) .append(
Route::new("users").append(Route::new("<id:u64>").get(get_user)), );
println!("📖 API文档地址:");
println!(" Swagger UI: http://localhost:8080/swagger-ui");
println!(" OpenAPI JSON: http://localhost:8080/swagger-ui/openapi.json");
println!();
println!("🔗 API端点:");
println!(" GET / - Hello World");
println!(" GET /health - 健康检查");
println!(" GET /users/{{id}} - 获取用户信息");
println!();
println!("✨ 服务启动成功!按 Ctrl+C 停止服务");
let addr = "127.0.0.1:8080".parse().expect("Invalid address");
Server::new().bind(addr).serve(routes).await;
Ok(())
}