First commit
This commit is contained in:
commit
b830d3cf07
12 changed files with 2068 additions and 0 deletions
4
.gitignore
vendored
Normal file
4
.gitignore
vendored
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
/target
|
||||||
|
**/*.rs.bk
|
||||||
|
key.secret
|
||||||
|
WebSharper/key
|
||||||
1876
Cargo.lock
generated
Normal file
1876
Cargo.lock
generated
Normal file
File diff suppressed because it is too large
Load diff
14
Cargo.toml
Normal file
14
Cargo.toml
Normal file
|
|
@ -0,0 +1,14 @@
|
||||||
|
[package]
|
||||||
|
name = "recipes"
|
||||||
|
version = "1.0.0"
|
||||||
|
authors = ["Grégory Burri <greg.burri@gmail.com>"]
|
||||||
|
edition = "2018"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
actix-web = "1.0"
|
||||||
|
actix-files = "0.1"
|
||||||
|
askama = "0.8" # Template system
|
||||||
|
serde = { version = "1.0", features = ["derive"] }
|
||||||
|
listenfd = "0.3" # To watch file modifications and automatically launch a build process (only used in dev/debug).
|
||||||
|
ron = "0.5" # Rust object notation, to load configuration files.
|
||||||
|
itertools = "0.8"
|
||||||
3
README.md
Normal file
3
README.md
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
== Autoreload
|
||||||
|
|
||||||
|
https://actix.rs/docs/autoreload/
|
||||||
1
TODO.md
Normal file
1
TODO.md
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
* Enable Logging.
|
||||||
3
conf.ron
Normal file
3
conf.ron
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
(
|
||||||
|
port: 8082,
|
||||||
|
)
|
||||||
29
deploy.ps1
Normal file
29
deploy.ps1
Normal file
|
|
@ -0,0 +1,29 @@
|
||||||
|
if ($args.Count -lt 1) {
|
||||||
|
$scriptName = [Environment]::GetCommandLineArgs()[1]
|
||||||
|
echo "Usage: $scriptName <destination>"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
systemctl --user stop www-recipes.service
|
||||||
|
|
||||||
|
git pull
|
||||||
|
cargo build --release
|
||||||
|
|
||||||
|
$destination=$args[0]
|
||||||
|
|
||||||
|
if (!(Test-Path -Path $destination)) {
|
||||||
|
New-Item -ItemType directory -Path $destination
|
||||||
|
}
|
||||||
|
|
||||||
|
Copy-Item target/release/rup -Destination $destination
|
||||||
|
Copy-Item key.secret -Destination $destination
|
||||||
|
|
||||||
|
Copy-Item static -Destination $destination -Recurse -Force
|
||||||
|
|
||||||
|
# Do not overwrite the configuration.
|
||||||
|
if (!(Test-Path -Path $destination/conf.ron)) {
|
||||||
|
Copy-Item conf.ron -Destination $destination
|
||||||
|
}
|
||||||
|
|
||||||
|
systemctl --user start www-recipes.service
|
||||||
|
|
||||||
2
launch_debug.ps1
Normal file
2
launch_debug.ps1
Normal file
|
|
@ -0,0 +1,2 @@
|
||||||
|
# To launch RUP and watching source. See https://actix.rs/docs/autoreload/.
|
||||||
|
systemfd --no-pid -s http::8082 -- cargo watch -x run
|
||||||
1
src/consts.rs
Normal file
1
src/consts.rs
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
pub static FILE_CONF: &str = "conf.ron";
|
||||||
100
src/main.rs
Normal file
100
src/main.rs
Normal file
|
|
@ -0,0 +1,100 @@
|
||||||
|
extern crate actix_web;
|
||||||
|
extern crate listenfd;
|
||||||
|
extern crate askama;
|
||||||
|
|
||||||
|
use listenfd::ListenFd;
|
||||||
|
use actix_files as fs;
|
||||||
|
use actix_web::{web, middleware, App, HttpServer, HttpResponse, Result, web::Query};
|
||||||
|
use askama::Template;
|
||||||
|
|
||||||
|
use std::io::prelude::*;
|
||||||
|
use ron::de::from_reader;
|
||||||
|
use serde::Deserialize;
|
||||||
|
use std::{fs::File, env::args};
|
||||||
|
|
||||||
|
use itertools::Itertools;
|
||||||
|
|
||||||
|
mod consts;
|
||||||
|
|
||||||
|
#[derive(Template)]
|
||||||
|
#[template(path = "main.html")]
|
||||||
|
struct MainTemplate<'a> {
|
||||||
|
test: &'a str,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Deserialize)]
|
||||||
|
pub struct Request {
|
||||||
|
m: Option<String>
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main_page(query: Query<Request>) -> Result<HttpResponse> {
|
||||||
|
|
||||||
|
let main_template = MainTemplate { test: &"test" };
|
||||||
|
|
||||||
|
let s = main_template.render().unwrap();
|
||||||
|
Ok(HttpResponse::Ok().content_type("text/html").body(s))
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Deserialize)]
|
||||||
|
struct Config {
|
||||||
|
port: u16
|
||||||
|
}
|
||||||
|
|
||||||
|
fn get_exe_name() -> String {
|
||||||
|
let first_arg = std::env::args().nth(0).unwrap();
|
||||||
|
let sep: &[_] = &['\\', '/'];
|
||||||
|
first_arg[first_arg.rfind(sep).unwrap()+1..].to_string()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() -> std::io::Result<()> {
|
||||||
|
if process_args() { return Ok(()) }
|
||||||
|
|
||||||
|
println!("Starting RUP as web server...");
|
||||||
|
|
||||||
|
let config: Config = {
|
||||||
|
let f = File::open(consts::FILE_CONF).unwrap_or_else(|_| panic!("Failed to open configuration file {}", consts::FILE_CONF));
|
||||||
|
match from_reader(f) {
|
||||||
|
Ok(c) => c,
|
||||||
|
Err(e) => panic!("Failed to load config: {}", e)
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
println!("Configuration: {:?}", config);
|
||||||
|
|
||||||
|
let mut listenfd = ListenFd::from_env();
|
||||||
|
let mut server =
|
||||||
|
HttpServer::new(
|
||||||
|
|| {
|
||||||
|
App::new()
|
||||||
|
.wrap(middleware::Compress::default())
|
||||||
|
.wrap(middleware::Logger::default())
|
||||||
|
.service(web::resource("/").to(main_page))
|
||||||
|
.service(fs::Files::new("/static", "static").show_files_listing())
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
server =
|
||||||
|
if let Some(l) = listenfd.take_tcp_listener(0).unwrap() {
|
||||||
|
server.listen(l).unwrap()
|
||||||
|
} else {
|
||||||
|
server.bind(&format!("0.0.0.0:{}", config.port)).unwrap()
|
||||||
|
};
|
||||||
|
|
||||||
|
server.run()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn process_args() -> bool {
|
||||||
|
fn print_usage() {
|
||||||
|
println!("Usage:");
|
||||||
|
println!(" {} [--help]", get_exe_name());
|
||||||
|
}
|
||||||
|
|
||||||
|
let args: Vec<String> = args().collect();
|
||||||
|
|
||||||
|
if args.iter().any(|arg| arg == "--help") {
|
||||||
|
print_usage();
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
false
|
||||||
|
}
|
||||||
19
static/style.css
Normal file
19
static/style.css
Normal file
|
|
@ -0,0 +1,19 @@
|
||||||
|
* {
|
||||||
|
margin: 50px;
|
||||||
|
padding: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
font-size: 18px;
|
||||||
|
text-shadow: 2px 2px 2px #DDD;
|
||||||
|
text-align: center;
|
||||||
|
line-height: 18px;
|
||||||
|
color: #5b5b5b;
|
||||||
|
background-color: #ededed;
|
||||||
|
margin: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
img {
|
||||||
|
border: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
16
templates/main.html
Normal file
16
templates/main.html
Normal file
|
|
@ -0,0 +1,16 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8" />
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
|
<title>rouleunpet</title>
|
||||||
|
<link href="static/lobster-two-font.css" rel="stylesheet" type="text/css" />
|
||||||
|
<link rel="stylesheet" type="text/css" href="static/style.css" />
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<div class="container">
|
||||||
|
<h1>{{ test }}</h1>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
Loading…
Add table
Add a link
Reference in a new issue