| Crates.io | oxidite-core |
| lib.rs | oxidite-core |
| version | 2.0.1 |
| created_at | 2025-12-07 12:34:22.893428+00 |
| updated_at | 2026-01-24 18:46:06.939772+00 |
| description | Core HTTP server and routing for the Oxidite v2 web framework |
| homepage | |
| repository | https://github.com/meshackbahati/rust-oxidite |
| max_upload_size | |
| id | 1971511 |
| size | 116,998 |
Core HTTP server and routing for the Oxidite web framework.
oxidite-core provides the foundational building blocks for the Oxidite web framework, including the HTTP server, router, request/response types, and type-safe extractors. It serves as the base layer upon which all other Oxidite components are built.
Add this to your Cargo.toml:
[dependencies]
oxidite-core = "0.1"
tokio = { version = "1", features = ["full"] }
hyper for high-performance HTTP handlingtower ecosystemuse oxidite_core::{Router, Server, Response};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let mut router = Router::new();
router.get("/", |_req| async {
Ok(Response::text("Hello, Oxidite!"))
});
Server::new(router)
.listen("127.0.0.1:3000".parse().unwrap())
.await
}
oxidite-core provides several type-safe extractors for handling different kinds of requests:
use oxidite_core::{Router, Server, Response, Error, extract::*};
use serde::{Serialize, Deserialize};
#[derive(Deserialize, Serialize)]
struct User {
name: String,
email: String,
}
// JSON extractor
async fn create_user(Json(user): Json<User>) -> Result<Response, Error> {
Ok(Response::json(serde_json::json!({
"message": "User created successfully",
"user": user
})))
}
// Query parameters extractor
async fn search_users(Query(params): Query<User>) -> Result<Response, Error> {
Ok(Response::json(serde_json::json!(params)))
}
// Path parameters extractor
#[derive(Deserialize)]
struct UserId {
id: u32,
}
async fn get_user(Path(params): Path<UserId>) -> Result<Response, Error> {
Ok(Response::json(serde_json::json!({
"id": params.id,
"name": "Sample User"
})))
}
// Form data extractor
async fn create_user_from_form(Form(user): Form<User>) -> Result<Response, Error> {
Ok(Response::json(serde_json::json!({
"message": "User created from form",
"user": user
})))
}
// Cookies extractor
async fn get_cookies(Cookies(cookies): Cookies) -> Result<Response, Error> {
Ok(Response::json(serde_json::json!(cookies)))
}
// Raw body extractor
async fn handle_raw_body(Body(body): Body) -> Result<Response, Error> {
Ok(Response::text(format!("Received {} characters", body.len())))
}
use oxidite_core::{Router, Server, Response};
let mut router = Router::new();
// Basic routes
router.get("/", handler);
router.post("/users", create_user);
router.put("/users/:id", update_user);
router.delete("/users/:id", delete_user);
// Path parameters
router.get("/users/:user_id/posts/:post_id", get_post);
// Wildcard routes (should be registered last)
router.get("/static/*", serve_static);
oxidite-core provides convenient response utilities:
use oxidite_core::Response;
// Text response
let text_response = Response::text("Plain text");
// JSON response
let json_response = Response::json(serde_json::json!({
"message": "Success",
"data": [1, 2, 3]
}));
// HTML response
let html_response = Response::html("<h1>HTML Content</h1>");
// Custom status code
let custom_response = Response::builder()
.status(418) // I'm a teapot
.body("Teapot response");
The framework provides comprehensive error handling with appropriate HTTP status codes:
use oxidite_core::Error;
// Various error types
let not_found_error = Error::NotFound("Resource not found".to_string());
let bad_request_error = Error::BadRequest("Invalid request".to_string());
let forbidden_error = Error::Forbidden("Access denied".to_string());
let conflict_error = Error::Conflict("Resource conflict".to_string());
MIT