]> git.r.bdr.sh - rbdr/blog/blobdiff - src/command/add.rs
Add part of the implementation for add
[rbdr/blog] / src / command / add.rs
index bc1bea0bb06c86f2077b374b7de68a51cbd0cb5b..3e0e9876cbb5268aacace5762a202ea74de38a98 100644 (file)
@@ -1,10 +1,12 @@
-use std::io::Result;
+use std::fs::{create_dir_all, remove_dir_all, rename};
+use std::io::{Result, Error};
 use super::{
     generate::Generate,
     sync_down::SyncDown,
     sync_up::SyncUp,
     update::Update
 };
+use crate::configuration::Configuration;
 
 pub struct Add;
 
@@ -12,6 +14,24 @@ impl Add {
     pub fn new() -> Self {
         Add
     }
+
+    // moves posts to their next
+    fn shift(&self, configuration: &Configuration) -> Result<()> {
+        for i in (0..configuration.max_posts).rev() {
+            let source = configuration.posts_directory.join(i.to_string());
+            let target = configuration.posts_directory.join((i + 1).to_string());
+
+            println!("Moving {} source to {}", source.display(), target.display());
+
+            if source.exists() {
+                match rename(&source, &target) {
+                    Ok(_) => continue,
+                    Err(e) => return Err(Error::new(e.kind(), format!("Could not shift post {} to {}", source.display(), target.display())))
+                }
+            }
+        }
+        Ok(())
+    }
 }
 
 impl super::Command for Add {
@@ -19,9 +39,23 @@ impl super::Command for Add {
         vec![Box::new(SyncDown::new())]
     }
 
-    fn execute(&self, input: Option<&String>) -> Result<()> {
-        println!("Add: {:?}!", input);
-        return Ok(())
+    fn execute(&self, _: Option<&String>, configuration: &Configuration, _: &String) -> Result<()> {
+        match create_dir_all(&configuration.posts_directory) {
+            Ok(_) => {
+                match self.shift(configuration) {
+                    Ok(_) => {
+                        let first_directory = configuration.posts_directory.join("0");
+                        let _ = remove_dir_all(&first_directory);
+                        match create_dir_all(&configuration.posts_directory) {
+                            Ok(_) => Ok(()),
+                            Err(e) => Err(Error::new(e.kind(), format!("Could not create first post directory")))
+                        }
+                    },
+                    Err(e) => Err(e)
+                }
+            },
+            Err(e) => Err(Error::new(e.kind(), format!("Could not create posts directory")))
+        }
     }
 
     fn after_dependencies(&self) -> Vec<Box<dyn super::Command>> {