Johann Woelper hace 7 años
padre
commit
cd5aab4a15
Se han modificado 2 ficheros con 141 adiciones y 41 borrados
  1. 46 9
      src/main.rs
  2. 95 32
      static/index.html

+ 46 - 9
src/main.rs

@@ -5,27 +5,35 @@
 #[macro_use] extern crate lazy_static;
 extern crate rocket_cors;
 
+use std::io::prelude::*;
 use std::fs::File;
 use std::path::{Path, PathBuf};
-use std::io::prelude::*;
+use std::thread;
+use std::time::Duration;
 use std::sync::Mutex;
-use rocket::http::Method;
-use rocket_cors::{AllowedOrigins, AllowedHeaders};
 use rocket::response::NamedFile;
 
 lazy_static! {
     static ref OBJECT: Mutex<String> = Mutex::new(String::from("{}"));
 }
 
-
+// send out the stored object
 #[get("/")]
 fn get() -> String {
-    let result: &String = &*OBJECT.lock().unwrap();
-    result.clone()
+    match OBJECT.lock() {
+        Ok(obj) => {
+            println!("MATCH obj {:?}", *obj);
+            let result: &String = &*obj;
+            result.clone()
+        },
+        _ => {
+            println!("UNCLOCK failed");
+            String::from("{}")
+        }
+    }
 }
 
-
-
+//set the storage
 #[get("/<obj>")]
 fn set(obj: String) -> String {
     let parsed = obj;
@@ -35,7 +43,7 @@ fn set(obj: String) -> String {
     String::from("ok")
 }
 
-
+// Static file serving
 #[get("/<file..>")]
 fn static_content(file: PathBuf) -> NamedFile {
     let f = NamedFile::open(Path::new("static/").join(file));
@@ -45,6 +53,32 @@ fn static_content(file: PathBuf) -> NamedFile {
     }
 }
 
+// periodically dump the database
+fn disk_committer() {
+    thread::spawn(|| {
+        loop {
+            thread::sleep(Duration::from_secs(2));
+            match OBJECT.lock() {
+                Ok(obj) => {
+                    let result: &String = &*obj;
+                    let mut buffer = File::create("db").unwrap();
+                    buffer.write(result.as_bytes()).unwrap();
+                    println!("Commiting to disk");
+                },
+                _ => ()
+            }
+        }
+    });
+}
+
+fn read_db() {    
+    let mut f = File::open("db").expect("db file not found");
+    let mut contents = String::new();
+    f.read_to_string(&mut contents).expect("{}");
+    let mut data = OBJECT.lock().unwrap();
+    *data = contents;
+}
+
 fn main() {
 
     // let (allowed_origins, failed_origins) = AllowedOrigins::some(&["https://www.acme.com"]);
@@ -61,6 +95,9 @@ fn main() {
 
     // let default = rocket_cors::Cors::default();
 
+    // Load from db
+    read_db();
+    disk_committer();
     rocket::ignite()
     .mount("/set", routes![set])
     .mount("/get", routes![get])

+ 95 - 32
static/index.html

@@ -30,47 +30,89 @@
 
 
 <div id="app">
-    <main class="mdl-layout__content">
-        <div class="page-content">
-            yo yo yo
-            <br> hi {{config}}
-            <br>
-            <div>
-                <input v-model="config.num_lives"></input>
+
+    <div class="mdl-layout mdl-js-layout mdl-layout--fixed-header">
+        <header class="mdl-layout__header">
+            <div class="mdl-layout__header-row">
+                <!-- Title -->
+                <span class="mdl-layout-title">
+                    {{config.appname}}
+                </span>
+                <div class="mdl-layout-spacer"></div>
+
+
+                <!-- Add spacer, to align navigation to the right -->
+                <div class="mdl-layout-spacer"></div>
+                <!-- Navigation. We hide it in small screens. -->
+                <nav class="mdl-navigation mdl-layout--large-screen-only">
+                </nav>
             </div>
-            <a onclick="store.getter()">get</a>
-            <br>
-            <a onclick="store.setter(app.config)">set</a>
+        </header>
+        <div class="mdl-layout__drawer">
+            <span class="mdl-layout-title">Title</span>
+            <nav class="mdl-navigation">
+            </nav>
 
 
         </div>
-    </main>
+        <main class="mdl-layout__content">
+            <div class="page-content">
+
+                <div class="mdl-tabs mdl-js-tabs mdl-js-ripple-effect">
+                    <div class="mdl-tabs__tab-bar">
+                        <a href="#updates" class="mdl-tabs__tab is-active">updates</a>
+                        <a href="#summary" class="mdl-tabs__tab">summary</a>
+                        <a href="#debug" class="mdl-tabs__tab">debug</a>
+                    </div>
+
+                    <div class="mdl-tabs__panel is-active" id="updates">
+
+
+                        
+                        <div class="entry">
+
+                            <template v-for="studio in config.studios">
+                                <template v-for="member in studio">
+                                    <div>
+                                        <span style="width: 10em; display: inline-block">
+                                            {{member.name}}
+                                        </span>
+                                        <textarea cols="50" rows="5" v-model="member.task" placeholder="Enter updates"></textarea>
+
+                                    </div>
+                                </template>
+
+                            </template>
+                            
+                            
+                        </div>
+                        
+                        
+                    </div>
+                    <div class="mdl-tabs__panel" id="summary">
+                        <div class="entry">
+                            <span class="descriptor">Episode</span>
+                            <input type="number" v-model="config.released_episode">
+                        </div>
+                    </div>
+                    <div class="mdl-tabs__panel" id="debug">
+                        <pre>
+                            {{config.studios}}
+                        </pre>                        
+                    </div>
+    
+ 
+                </div>
+
+            </div>
+        </main>
+    </div>
 </div>
 
 
 <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
 <script>
-
-
-
-
-var app = new Vue({
-        el: '#app',
-        data: {
-            config: {
-                num_lives: 42,
-                levels: ["Fluff"],
-            },
-        },
-        mounted: function () {
-            // store.object = this.config;
-            // getData();
-        },
-        watch: {},
-        computed: {
-            test: function () {},
-        }
-    })
+var app = '';
 
 var store = {
     server_url: "http://localhost:8000",
@@ -101,6 +143,27 @@ var store = {
 };
 
 
+var app = new Vue({
+        el: '#app',
+        data: {
+            config: {
+                num_lives: 42,
+                levels: ["Fluff"],
+            },
+        },
+        mounted: function () {
+            // store.object = this.config;
+            store.getter();
+        },
+        watch: {},
+        computed: {
+            test: function () {},
+        }
+    })
+
+
+
+
 
 </script>
 <link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">