-
Notifications
You must be signed in to change notification settings - Fork 50
/
main.rs
134 lines (104 loc) · 3.54 KB
/
main.rs
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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#![feature(env)]
#![feature(plugin)]
#![feature(core)]
#![feature(old_io)]
#![feature(old_path)]
#![plugin(deuterium_plugin)]
#![plugin(docopt_macros)]
extern crate postgres;
#[macro_use] #[no_link] extern crate deuterium_plugin;
#[macro_use] extern crate deuterium_orm;
extern crate rustless;
extern crate typemap;
extern crate time;
extern crate "rustc-serialize" as rustc_serialize;
extern crate iron;
extern crate docopt;
extern crate uuid;
extern crate jsonway;
extern crate valico;
extern crate url;
use std::env;
use rustless::prelude::*;
use rustless::batteries::schemes;
use rustless::batteries::swagger;
use valico::json_schema;
use std::old_io::net::ip;
use self::db::DatabaseExt;
mod db;
mod serializers;
mod models;
mod api;
docopt!(Args derive Debug, "
Example backend.
Usage:
backend run
backend g migration <migration-name>
backend db migrate [<version>]
backend db rollback [<steps>]
backend --version
Options:
-h --help Show this screen.
--version Show version.
--ip=<ip> Specify server ip [default: 127.0.0.1]
--port=<port> Specify server port [default: 3001]
");
fn run_db(app: &mut rustless::Application) {
let connection_str = env::var("POSTGRES_CONNECTION")
.ok().expect("Provide POSTGRES_CONNECTION environment variable");
let pool = self::db::setup(&connection_str[..], 5);
// Here we use TypeMap to store out database pool
app.ext.insert::<self::db::AppDb>(pool);
}
#[allow(dead_code)]
fn main() {
let mut app = rustless::Application::new(self::api::root());
swagger::enable(&mut app, swagger::Spec {
info: swagger::Info {
title: "Example tweet API".to_string(),
description: Some("Simple API to demonstration".to_string()),
contact: Some(swagger::Contact {
name: "Stanislav Panferov".to_string(),
url: Some("http://panferov.me".to_string()),
..std::default::Default::default()
}),
license: Some(swagger::License {
name: "MIT".to_string(),
url: "http://opensource.org/licenses/MIT".to_string()
}),
..std::default::Default::default()
},
..std::default::Default::default()
});
let args: Args = Args::docopt().decode().unwrap_or_else(|e| e.exit());
println!("{:?}", args);
if args.flag_version {
println!("0.0.0-dev")
} else if args.cmd_run {
app.root_api.mount(swagger::create_api("api-docs"));
schemes::enable_schemes(&mut app, json_schema::Scope::new()).unwrap();
run_db(&mut app);
// See `iron` docs for clarification.
let chain = iron::Chain::new(app);
let host: ip::IpAddr = args.flag_ip.parse().unwrap();
let port: u16 = args.flag_port.parse().unwrap();
iron::Iron::new(chain).http((host, port)).unwrap();
println!("On {}", port);
} else if args.cmd_db && args.cmd_migrate {
run_db(&mut app);
deuterium_orm::migration::run(&db::migrations::migrations(), &*app.db());
} else if args.cmd_db && args.cmd_rollback {
run_db(&mut app);
deuterium_orm::migration::rollback(
args.arg_steps.parse().unwrap_or(1),
&db::migrations::migrations(),
&*app.db()
);
} else if args.cmd_g && args.cmd_migration {
let name = deuterium_orm::migration::create_migration_file(
&args.arg_migration_name[..],
Path::new("src/db/migrations")
);
println!("Migration with name {} was generated.", name);
}
}