chiark / gitweb /
rationalised directory config
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 22 Nov 2020 11:47:38 +0000 (11:47 +0000)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 22 Nov 2020 11:47:38 +0000 (11:47 +0000)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
server.toml
src/accounts.rs
src/config.rs
src/global.rs

index b6ae80d33bd5cd4b99a5b5ee3e825103e10ae821..fcdc631c3e45eaec4dbaa6511f2e65a9c6e43ac3 100644 (file)
@@ -10,7 +10,8 @@
 public_url = "http://localhost:8000"
 #sse_wildcard_url = "http://*.sse.localhost:8000"
 
-save_directory = "/home/rustcargo/Rustup/Game/server"
+save_dir = "/home/rustcargo/Rustup/Game/server"
+command_socket = "/home/rustcargo/Rustup/Game/server/command.socket"
 template_dir = "/home/ian/Rustup/Game/server/templates"
 bundled_sources = "/home/rustcargo/Rustup/Game/server/target/bundled-sources"
 wasm_dir = "/home/rustcargo/Rustup/Game/server/target/packed-wasm"
index b0239a1060a4175924f0370d8ccf0c6ee3a0e464..4c4743d5591f68058f428e97e8288707c9714544 100644 (file)
@@ -402,7 +402,7 @@ impl AccountsGuard {
 //---------- load/save ----------
 
 fn save_path() -> String {
-  format!("{}/{}", config().save_directory, &ACCOUNTS_FILE)
+  format!("{}/{}", config().save_dir, &ACCOUNTS_FILE)
 }
 
 #[throws(StartupError)]
index 628898ccc7b21c728e4b431df7cde1640060dc06..1ef852b994815899aefb489b4fb69ea9e9a2aa3b 100644 (file)
@@ -12,15 +12,10 @@ pub const EXIT_DISASTER  : i32 = 16;
 pub const DEFAULT_CONFIG_DIR      : &str = "/etc/otter";
 pub const DEFAULT_CONFIG_LEAFNAME : &str = "server.toml";
 
-const DEFAULT_SAVE_DIRECTORY : &str = "save";
-const DEFAULT_COMMAND_SOCKET : &str = "command.socket"; // in save dir
-const DEFAULT_TEMPLATE_DIR : &str = "templates";
-const DEFAULT_LIBRARY_DIR : &str = "library";
-const DEFAULT_WASM_DIR : &str = "target/packed-wasm";
-
 #[derive(Deserialize,Debug,Clone)]
 pub struct ServerConfigSpec {
-  pub save_directory: Option<String>,
+  pub base_dir: Option<String>,
+  pub save_dir: Option<String>,
   pub command_socket: Option<String>,
   pub debug: Option<bool>,
   pub http_port: Option<u16>,
@@ -36,7 +31,7 @@ pub struct ServerConfigSpec {
 
 #[derive(Debug,Clone)]
 pub struct ServerConfig {
-  pub save_directory: String,
+  pub save_dir: String,
   pub command_socket: String,
   pub debug: bool,
   pub http_port: Option<u16>,
@@ -55,20 +50,30 @@ impl TryFrom<ServerConfigSpec> for ServerConfig {
   #[throws(Self::Error)]
   fn try_from(spec: ServerConfigSpec) -> ServerConfig {
     let ServerConfigSpec {
-      save_directory, command_socket, debug,
+      base_dir, save_dir, command_socket, debug,
       http_port, public_url, sse_wildcard_url, rocket_workers,
       template_dir, wasm_dir,
       log, bundled_sources, shapelibs,
     } = spec;
 
-    let save_directory = save_directory
-      .unwrap_or_else(|| DEFAULT_SAVE_DIRECTORY.to_owned());
+    let defpath = |specd: Option<String>, leaf: &str| -> String {
+      specd.unwrap_or_else(|| match &base_dir {
+        Some(base) => format!("{}/{}", &base, &leaf),
+        None       => leaf.to_owned(),
+      })
+    };
+
+    let save_dir        = defpath(save_dir,        "save"              );
+    let command_socket  = defpath(command_socket,  "var/command.socket");
+    let template_dir    = defpath(template_dir,    "assets"            );
+    let wasm_dir        = defpath(wasm_dir,        "assets"            );
+    let bundled_sources = defpath(bundled_sources, "bundled-sources"   );
+    const DEFAULT_LIBRARY_GLOB : &str = "library/*.toml";
 
-    let mut command_socket = command_socket
-      .unwrap_or_else(|| DEFAULT_COMMAND_SOCKET.to_owned());
-    if !command_socket.starts_with('/') {
-      command_socket = format!("{}/{}", save_directory, command_socket);
-    }
+    let shapelibs = shapelibs.unwrap_or_else(||{
+      let glob = defpath(None, DEFAULT_LIBRARY_GLOB);
+      vec![ shapelib::Config1::PathGlob(glob) ]
+    });
 
     let public_url = public_url
       .trim_end_matches('/')
@@ -88,9 +93,6 @@ impl TryFrom<ServerConfigSpec> for ServerConfig {
     let rocket_workers = rocket_workers.unwrap_or(
       if debug { 20 } else { 1000 });
 
-    let template_dir = template_dir
-      .unwrap_or_else(|| DEFAULT_TEMPLATE_DIR.to_owned());
-
     let log = {
       use toml::Value::Table;
       match log {
@@ -106,18 +108,8 @@ impl TryFrom<ServerConfigSpec> for ServerConfig {
     let log = LogSpecification::from_toml(&log)
       .context("log specification")?;
 
-    let bundled_sources = bundled_sources
-      .unwrap_or_else(|| save_directory.clone());
-
-    let shapelibs = shapelibs.unwrap_or_else(
-      ||vec![ shapelib::Config1::PathGlob(
-        format!("{}/*.toml", DEFAULT_LIBRARY_DIR)
-      )]);
-
-    let wasm_dir = wasm_dir.unwrap_or_else(|| DEFAULT_WASM_DIR.to_owned());
-
     ServerConfig {
-      save_directory, command_socket, debug,
+      save_dir, command_socket, debug,
       http_port, public_url, sse_wildcard_url, rocket_workers,
       template_dir, wasm_dir,
       log, bundled_sources, shapelibs,
index 1fda65470c135a147463e6f049d858b93db0d90e..c2e6a0c7fd94ccb1536b5d2826abce98f3c70886 100644 (file)
@@ -796,7 +796,7 @@ enum SavefilenameParseResult {
 }
 
 fn savefilename(name: &InstanceName, prefix: &str, suffix: &str) -> String {
-  [ config().save_directory.as_str(), &"/", prefix ]
+  [ config().save_dir.as_str(), &"/", prefix ]
     .iter().map(Deref::deref)
     .chain(iter::once( name.to_string().as_str() ))
     .chain([ suffix ].iter().map(Deref::deref))
@@ -908,7 +908,7 @@ impl InstanceGuard<'_> {
       let mut st = GLOBAL.save_area_lock.lock().unwrap();
       let st = &mut *st;
       if st.is_none() {
-        let lockfile = format!("{}/lock", config().save_directory);
+        let lockfile = format!("{}/lock", config().save_dir);
         *st = Some((||{
           let file = File::create(&lockfile).context("open")?;
           file.try_lock_exclusive().context("lock")?;
@@ -1025,7 +1025,7 @@ pub fn load_games(accounts: &mut AccountsGuard,
   use AFState::*;
   use SavefilenameParseResult::*;
   let mut a_leaves = HashMap::new();
-  for de in fs::read_dir(&config().save_directory)? {
+  for de in fs::read_dir(&config().save_dir)? {
     let de = de?;
     let leaf = de.file_name();
     (||{