Crates.io | vial |
lib.rs | vial |
version | 0.1.9 |
source | src |
created_at | 2020-05-19 23:50:11.867227 |
updated_at | 2020-12-13 19:20:03.440303 |
description | a micro micro-framework |
homepage | https://vial.rs |
repository | https://github.com/xvxx/vial |
max_upload_size | |
id | 243632 |
size | 114,303 |
Vial is a small web "framework" for making small web sites in Rust.
It includes just a few basics:
Everything else... well, that's up to you.
The goal is an as-few-as-possible-dependencies web library you can use to test out an idea quickly or get a personal project rolling. Single file, server side apps? You bet! Fast compilation? Yes please! À la carte dependencies? Now you're talkin'!
It's sort of like a picnic where the playlist is all 90s music and you have to bring your own beverages. And food.
To learn more, keep reading or visit one of these links:
⚠ Status: Vial is currently in early development. It is being developed alongside deadwiki, but that is strictly for personal use. Please proceed with caution and wear a hart hat at all times.
To get started, just add vial
to your Cargo.toml
:
[dependencies]
vial = "0.1"
Now you can use vial::prelude::*;
in your application to pull in the
common types, or just use the crate like any other.
As is tradition:
vial::routes! {
GET "/" => |_| "Hello, world!";
}
fn main() {
vial::run!().unwrap();
}
For a bit more sanity, you can route to functions directly:
use vial::prelude::*;
routes! {
GET "/echo" => echo;
POST "/echo" => post;
}
fn echo(_: Request) -> &'static str {
"<form method='POST'>
<input type='text' name='echo'/>
<input type='submit'/>
</form>"
}
fn post(req: Request) -> String {
format!(
"<h1>You said: {}</h1>",
req.form("echo").unwrap_or("You didn't say anything!")
)
}
fn main() {
vial::run!().unwrap();
}
To really break the mold, you can split your site into different modules:
use vial;
mod wiki;
mod blog;
mod index {
use vial::prelude::*;
routes! {
GET "/" => |_| Response::from_file("index.html")
}
}
fn main() {
// The order matters here - if `wiki` and `blog` both define "/",
// the `mod index` version will match first and get run.
vial::run!(index, wiki, blog);
}
But hey, who wants to putz around with HTML when you can be writing
Rust? Enable the horror
feature and you're on your way:
use vial::prelude::*;
#[macro_use]
extern crate horrorshow;
routes! {
GET "/" => |_| html! {
p {
: "You're looking for this: ";
a(href="/echo") { : "echo" }
}
};
GET "/echo" => echo;
POST "/echo" => post;
}
fn echo(_: Request) -> impl Responder {
html! {
form(method="POST") {
p {
: "Type something: ";
input(type="text", name="echo");
input(type="submit");
}
}
}
}
fn post(req: Request) -> impl Responder {
owned_html! {
h1: req.form("echo")
.unwrap_or("You didn't say anything!");
}
}
fn main() {
vial::run!().unwrap();
}
vial doesn't come with JSON or a template engine or any of that
fancy stuff by default, but there (will be) a few compile-time
--features
you can activate for enhanced productivity:
Request::json
and Response::with_json
powers, via
Serde.Request::cookie()
, Response::with_cookie
, and
friends.Please note: The list above is a work-in-progress.
Your assets will automatically get reloaded in debug mode, complete with proper ETag support, but you probably want to refresh your Rust code, too.
Right now the easiest way is to use cargo-watch:
$ cargo install cargo-watch
$ cargo watch -x 'run --example hello_world'
Tests can be run on a recent version of stable Rust with
make test
. We also run tests on commits with GitHub
Actions.
Vial prefers to put everything in tests/
rather than include
tests directly in src/*.rs
files. To access private APIs in tests,
we make them pub
and use #[doc(hidden)]
. Your cooperation is
appreciated.
Vial is licensed under either of the following, at your option: