| Crates.io | rust-api-kit |
| lib.rs | rust-api-kit |
| version | 0.1.2 |
| created_at | 2025-06-25 15:22:40.624751+00 |
| updated_at | 2025-09-05 07:26:24.289476+00 |
| description | A type-safe API definition toolkit for Rust — define your API once and share it across client and server, with compile-time guarantees. |
| homepage | |
| repository | https://github.com/sterrlia/rust-api-kit |
| max_upload_size | |
| id | 1726027 |
| size | 63,975 |
#[derive(Serialize, Deserialize)]
pub struct LoginRequest {
pub username: String,
pub password: String,
}
#[derive(Serialize, Deserialize)]
pub struct LoginResponse {
pub user_id: i32,
pub token: String,
}
#[derive(Serialize, Deserialize)]
#[serde(tag = "type")]
pub enum LoginErrorResponse {
AccessDenied,
}
#[derive(Serialize, Deserialize)]
#[serde(tag = "type")]
pub enum UnexpectedErrorResponse {
InternalServerError,
}
#[derive(Serialize, Deserialize)]
#[serde(tag = "type")]
pub enum AuthenticatedUnexpectedErrorResponse {
InternalServerError,
InvalidAuthToken,
AuthTokenMissing
}
define_http_routes! {
group (
path "api";
auth BearerToken;
error AuthenticatedUnexpectedErrorResponse;
GET "get-messages" GetMessagesRequest => GetMessagesResponse | GetMessagesErrorResponse;
GET "get-users" GetUsersRequest => GetUsersResponse | GetUsersErrorResponse;
);
group (
path "api";
error UnexpectedErrorResponse;
POST "login" LoginRequest => LoginResponse | LoginErrorResponse;
);
}
pub type UnauthenticatedResponse<T, E> = Response<T, E, UnexpectedErrorResponse>;
pub async fn login(
extract::State(state): extract::State<state::ServiceState>,
Json(input): Json<LoginRequest>,
) -> UnauthenticatedResponse<LoginResponse, LoginErrorResponse> {
}
let http_api_routes = generate_routes! {
LoginRequest => login,
GetUsersRequest => get_users,
GetMessagesRequest => get_messages,
};
let app = Router::new()
.merge(http_api_routes);
Response is nested result, on first level you can match error response shared with other routes on second level you can match successful response and error response which belongs to that route
use rust_api_kit::http::client::{HttpClient, BasicHttpClientTrait}
pub fn login(&self, username: String, password: String) -> anyhow::Result<UserData> {
let request = LoginRequest {
username,
password,
}
let response = self.http_client.request(request).await??; // LoginResponse
UserData {
user_id: response.user_id,
token: response.token
}
}
My messenger project: https://github.com/sterrlia/nultr