1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#![allow(proc_macro_derive_resolution_fallback)]
#[macro_use]
extern crate diesel;
#[macro_use]
extern crate log;
#[macro_use]
extern crate serde_derive;
pub mod app;
pub mod handlers;
mod models;
pub mod rpi;
pub mod schema;
mod setup;
mod utilities;
use crate::app::AppState;
use crate::handlers::DbExecutor;
use actix::SyncArbiter;
use actix_web::server;
use diesel::{r2d2::ConnectionManager, SqliteConnection};
use dotenv::dotenv;
use std::env;
pub fn setup_and_run() {
dotenv().ok();
let database_url = env::var("DATABASE_URL").expect("DATABASE_URL not found");
let hostname = env::var("HOSTNAME").expect("HOSTNAME not found");
let port = env::var("PORT").expect("PORT not found");
env_logger::init();
let gpio_arc_mutex = rpi::create_gpio_arc_mutex().expect("Could not acquire GPIO");
let manager = ConnectionManager::<SqliteConnection>::new(database_url);
let pool = r2d2::Pool::builder()
.build(manager)
.expect("Failed to create r2d2 pool.");
let connection = pool.get().expect("Failed to acquire connection");
utilities::reset_table_gpio_state(&connection).expect("Unable to update table 'gpio_state'");
let env_keys = vec![
"GPIOS_IN_USE",
"GPIOS_MODE_OUTPUT",
"GPIOS_LEVEL_LOW",
];
let parsed_variables = setup::read_env_to_hashmap(&env_keys);
setup::commit_variables_to_db(&parsed_variables, &connection, gpio_arc_mutex.clone())
.expect("Error when setting up system");
let sys = actix::System::new("raspberry-web");
let addr = SyncArbiter::start(3, move || DbExecutor(pool.clone()));
let ip_port = format!("{}:{}", hostname, port);
let _server = server::new(move || {
app::create_app(AppState {
db: addr.clone(),
gpio_arc_mutex: gpio_arc_mutex.clone(),
})
})
.bind(&ip_port)
.expect(&format!("Can not bind to {}", &ip_port))
.start();
let _ = sys.run();
}