Crates.io | arcanum |
lib.rs | arcanum |
version | 0.1.2 |
source | src |
created_at | 2023-02-28 23:51:14.585839 |
updated_at | 2023-04-03 10:22:19.676883 |
description | A simple library to create web applications with a Django inspired interface |
homepage | https://github.com/Waayway/arcanum |
repository | https://github.com/Waayway/arcanum |
max_upload_size | |
id | 797589 |
size | 39,827 |
THIS PROJECT IS STILL IN DEVELOPMENT SO IT ISN'T DONE YET AND THINGS WILL CHANGE
This is a side project i've started to create a simple framework for myself.
TODO list:
Basic functionality (Routing, files)
Templating
Models (DB)
docs
to use this library add
[dependencies]
arcanum = "0.1"
serde = { version = "1.0", features = ["derive"] }
to the cargo.toml file.
to instantiate and run the basic web server is:
let mut server = WebServer::new("127.0.0.1", 7878);
server.run();
where the "127.0.0.1" is the address and 7878 is the port of the server.
to add a simple route use
server.add_simple_route("/", handle_main_route);
Where handle_main_route
is a function defined in the main.rs file
to define everything needed for handle_main_route like
#[derive(Serialize)]
struct HomepageContext {
title: String,
}
fn handle_main_route(_req: Request, _res: &mut Response) -> ReturnData {
let context = HomepageContext {
title: "Hello, world!".to_string(),
};
let template = Template::render_template("views/index.html", context);
return ReturnData::Text(template);
}
the HomepageContext gets used by Template to see what to insert into the template, you could add 90 other variables to it if it would be deemed necessary.
the views/index.html
content is like so
<!DOCTYPE html>
<html lang="en">
<head>
<title>Home page</title>
</head>
<body>
<h1>{ title }, Title from rust content Object</h1>
</body>
</html>
to add a route with params like an id or something similar we would use
server.add_route_with_params("/id/:id", handle_id_route);
in this case the /id route would still match this and no param would get passed (still working on that)
in this case the handle_id_route is handled like so:
#[derive(Serialize)]
struct IdPageContext {
id: String,
}
fn handle_id_route(
_req: Request,
_res: &mut Response,
params: HashMap<String, String>,
) -> ReturnData {
let context = IdPageContext {
id: params["id"].clone(),
};
let template = Template::render_template("views/id.html", context);
return ReturnData::Text(template);
}
Once again we are using templates
<!DOCTYPE html>
<html lang="en">
<head>
<title>Document</title>
</head>
<body>
<h1>{ id } This should be the id given by the path in the browser</h1>
</body>
</html>
this is the template for id.
serve_static_file
serves a static file based on the path you provide this cannot be used to provide as a function in add_simple_route, so you have to wrap it. see examples/basic/main.rs
for more info.