use std::io::prelude::*; use std::fs::{File, create_dir}; use std::path::Path; use errors::{Result, ResultExt}; pub fn create_file>(path: P, content: &str) -> Result<()> { let mut file = File::create(&path)?; file.write_all(content.as_bytes())?; Ok(()) } /// Very similar to `create_dir` from the std except it checks if the folder /// exists before creating it pub fn create_directory>(path: P) -> Result<()> { let path = path.as_ref(); if !path.exists() { create_dir(path) .chain_err(|| format!("Was not able to create folder {}", path.display()))?; } Ok(()) } /// Return the content of a file, with error handling added pub fn read_file>(path: P) -> Result { let path = path.as_ref(); let mut content = String::new(); File::open(path) .chain_err(|| format!("Failed to open '{:?}'", path.display()))? .read_to_string(&mut content)?; Ok(content) } /// Takes a full path to a .md and returns only the components after the `content` directory /// Will not return the filename as last component pub fn find_content_components>(path: P) -> Vec { let path = path.as_ref(); let mut is_in_content = false; let mut components = vec![]; for section in path.parent().unwrap().components() { let component = section.as_ref().to_string_lossy(); if is_in_content { components.push(component.to_string()); continue; } if component == "content" { is_in_content = true; } } components } #[cfg(test)] mod tests { use super::{find_content_components}; #[test] fn test_find_content_components() { let res = find_content_components("/home/vincent/code/site/content/posts/tutorials/python.md"); assert_eq!(res, ["posts".to_string(), "tutorials".to_string()]); } }