summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLars Wirzenius <liw@liw.fi>2021-09-23 09:42:32 +0300
committerLars Wirzenius <liw@liw.fi>2021-09-23 09:42:32 +0300
commitc88ef5bf4c78d8c06b81e35f2806d280bbcca479 (patch)
tree440bb310e355282b279bfe802f5170a9e9f5dc7b /src
parentb8e537e103d540a6d8dbb540676147ea2a88b89d (diff)
downloadjt2-c88ef5bf4c78d8c06b81e35f2806d280bbcca479.tar.gz
fix: if a topic path contains missing directories, create them
Sponsored-by: author
Diffstat (limited to 'src')
-rw-r--r--src/error.rs4
-rw-r--r--src/journal.rs11
2 files changed, 15 insertions, 0 deletions
diff --git a/src/error.rs b/src/error.rs
index 04ba777..c86ad13 100644
--- a/src/error.rs
+++ b/src/error.rs
@@ -22,6 +22,10 @@ pub enum JournalError {
#[error("directory {0} is not a journal")]
NotAJournal(String),
+ /// The specified directory for the journal does not exist.
+ #[error("journal directory does not exist: {0}")]
+ NoJournalDirectory(PathBuf),
+
/// Failed to create the directory for the journal.
#[error("failed to create journal directory {0}")]
CreateDirectory(PathBuf, #[source] std::io::Error),
diff --git a/src/journal.rs b/src/journal.rs
index a48a63d..270bb19 100644
--- a/src/journal.rs
+++ b/src/journal.rs
@@ -198,7 +198,18 @@ impl Journal {
let mut context = Context::new();
context.insert("title", title);
+ let dirname = self.dirname();
+ if !dirname.exists() {
+ return Err(JournalError::NoJournalDirectory(dirname.to_path_buf()));
+ }
+
let pathname = topic_path(self.dirname(), path);
+ let parent = pathname.parent().unwrap();
+ if !parent.is_dir() {
+ std::fs::create_dir_all(&parent)
+ .map_err(|err| JournalError::CreateDirectory(parent.to_path_buf(), err))?;
+ }
+
let text = self.templates.new_topic(&context)?;
std::fs::write(&pathname, text)
.map_err(|err| JournalError::WriteTopic(pathname.to_path_buf(), err))?;