Initial commit
This commit is contained in:
commit
2a164d5e72
|
@ -0,0 +1,3 @@
|
||||||
|
/target
|
||||||
|
**/*.rs.bk
|
||||||
|
Cargo.lock
|
|
@ -0,0 +1,13 @@
|
||||||
|
[package]
|
||||||
|
name = "pytron-web"
|
||||||
|
version = "0.1.0"
|
||||||
|
authors = ["Thomas Forgione <thomas@forgione.fr>"]
|
||||||
|
edition = "2018"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
rocket = "0.4.0"
|
||||||
|
|
||||||
|
rocket_contrib = { version = "0.4.0", features = ["tera_templates"] }
|
||||||
|
serde_derive = "1.0.89"
|
||||||
|
serde = "1.0.89"
|
||||||
|
serde_json = "1.0.39"
|
|
@ -0,0 +1,8 @@
|
||||||
|
{
|
||||||
|
"ias": ["ia1", "ia2", "ia3"],
|
||||||
|
"battles": {
|
||||||
|
"ia1/ia2": 0.3,
|
||||||
|
"ia1/ia3": 0.7,
|
||||||
|
"ia2/ia3": 0.5
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,44 @@
|
||||||
|
#[macro_use]
|
||||||
|
extern crate serde_derive;
|
||||||
|
|
||||||
|
use std::collections::HashMap;
|
||||||
|
use std::fs::File;
|
||||||
|
use std::io::Read;
|
||||||
|
|
||||||
|
#[derive(Serialize, Deserialize)]
|
||||||
|
/// The data contained from the json file generated by python.
|
||||||
|
pub struct Data {
|
||||||
|
/// The names of the IAs.
|
||||||
|
pub ias: Vec<String>,
|
||||||
|
|
||||||
|
/// The results of the battles.
|
||||||
|
pub battles: HashMap<String, f64>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Data {
|
||||||
|
/// Creates some test data.
|
||||||
|
pub fn test() -> Data {
|
||||||
|
|
||||||
|
// Open the file
|
||||||
|
let mut file = File::open("./assets/test.json")
|
||||||
|
.expect("Couldn't open file");
|
||||||
|
|
||||||
|
let mut content = String::new();
|
||||||
|
file.read_to_string(&mut content)
|
||||||
|
.expect("Couldn't read data");
|
||||||
|
|
||||||
|
serde_json::from_str(&content)
|
||||||
|
.expect("Couldn't parse json")
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Returns the result for a certain battle.
|
||||||
|
pub fn get(&self, ia1: &str, ia2: &str) -> Option<f64> {
|
||||||
|
if let Some(value) = self.battles.get(&format!("{}/{}", ia1, ia2)) {
|
||||||
|
Some(*value)
|
||||||
|
} else if let Some(value) = self.battles.get(&format!("{}/{}", ia2, ia1)) {
|
||||||
|
Some(1.0 - *value)
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,22 @@
|
||||||
|
#![feature(proc_macro_hygiene, decl_macro)]
|
||||||
|
|
||||||
|
#[macro_use]
|
||||||
|
extern crate rocket;
|
||||||
|
|
||||||
|
use rocket_contrib::templates::Template;
|
||||||
|
use rocket_contrib::serve::StaticFiles;
|
||||||
|
|
||||||
|
use pytron_web::Data;
|
||||||
|
|
||||||
|
#[get("/")]
|
||||||
|
fn hello() -> Template {
|
||||||
|
Template::render("index", &Data::test())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
rocket::ignite()
|
||||||
|
.mount("/", routes![hello])
|
||||||
|
.mount("/static", StaticFiles::from("static"))
|
||||||
|
.attach(Template::fairing())
|
||||||
|
.launch();
|
||||||
|
}
|
File diff suppressed because one or more lines are too long
|
@ -0,0 +1,49 @@
|
||||||
|
<!doctype html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
||||||
|
<link rel="stylesheet" href="/static/main.css">
|
||||||
|
{% block extracss %}{% endblock extracss %}
|
||||||
|
<title>Pytron</title>
|
||||||
|
</head>
|
||||||
|
<body class="layout-documentation page-components">
|
||||||
|
<nav class="navbar is-link" role="navigation" aria-label="main navigation">
|
||||||
|
<div class="container">
|
||||||
|
<div class="navbar-brand">
|
||||||
|
<a class="navbar-item is-size-4" href="/">
|
||||||
|
<strong>Pytron</strong>
|
||||||
|
</a>
|
||||||
|
<a role="button" class="navbar-burger burger" aria-label="menu" aria-expanded="false" data-target="navbarBasicExample">
|
||||||
|
<span aria-hidden="true"></span>
|
||||||
|
<span aria-hidden="true"></span>
|
||||||
|
<span aria-hidden="true"></span>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<div id="navbarBasicExample" class="navbar-menu">
|
||||||
|
<div class="navbar-end">
|
||||||
|
<a class="navbar-item is-size-6" href="/button">
|
||||||
|
<strong>Button</strong>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</nav>
|
||||||
|
{% block content %}{% endblock content %}
|
||||||
|
<script>
|
||||||
|
document.addEventListener('DOMContentLoaded', () => {
|
||||||
|
const $navbarBurgers = Array.prototype.slice.call(document.querySelectorAll('.navbar-burger'), 0);
|
||||||
|
if ($navbarBurgers.length > 0) {
|
||||||
|
$navbarBurgers.forEach( el => {
|
||||||
|
el.addEventListener('click', () => {
|
||||||
|
const target = el.dataset.target;
|
||||||
|
const $target = document.getElementById(target);
|
||||||
|
el.classList.toggle('is-active');
|
||||||
|
$target.classList.toggle('is-active');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -0,0 +1,11 @@
|
||||||
|
{% extends "base" %}
|
||||||
|
{% block content %}
|
||||||
|
<section class="section">
|
||||||
|
<div class="container">
|
||||||
|
<h1 class="title is-1">Welcome to Pytron</h1>
|
||||||
|
{% for ia in ias %}
|
||||||
|
<h5>{{ ia }}</h5>
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
{% endblock %}
|
Loading…
Reference in New Issue