Trait NotePathBuf

Source
pub trait NotePathBuf {
    // Required methods
    fn from_disassembled(
        sort_tag: &str,
        stem: &str,
        copy_counter: Option<usize>,
        extension: &str,
    ) -> Self;
    fn set_next_unused(&mut self) -> Result<(), FileError>;
    fn shorten_filename(&mut self);
}
Expand description

Extents PathBuf with methods dealing with paths to Tp-Note files.

Required Methods§

Source

fn from_disassembled( sort_tag: &str, stem: &str, copy_counter: Option<usize>, extension: &str, ) -> Self

Concatenates the sort_tag, stem, copy_counter, . and extension. This functions inserts all potentially necessary separators and extra separators.

Source

fn set_next_unused(&mut self) -> Result<(), FileError>

Append/increment a copy counter. When the path p exists on disk already, append some extension with an incrementing counter to the sort-tag in p until we find a free unused filename.

use std::env::temp_dir;
use std::fs;
use tpnote_lib::filename::NotePathBuf;

// Prepare test: create existing note file.
let raw = "some content";
let mut notefile = temp_dir().join("20221101-My day--Note.md");
fs::write(&notefile, raw.as_bytes()).unwrap();
let expected = temp_dir().join("20221101-My day--Note(1).md");
let _ = fs::remove_file(&expected);

// Start test
notefile.set_next_unused();
assert_eq!(notefile, expected);

When the filename is not used, keep it.

use std::env::temp_dir;
use std::fs;
use tpnote_lib::filename::NotePathBuf;

// Prepare test: make sure that there is no note file.
let mut notefile = temp_dir().join("20221102-My day--Note.md");
let _ = fs::remove_file(&notefile);
// The name should not change.
let expected = notefile.clone();

// Start test
notefile.set_next_unused();
assert_eq!(notefile, expected);
Source

fn shorten_filename(&mut self)

Shortens the stem of a filename so that filename.len() <= FILENAME_LEN_MAX. This method assumes, that the file stem does not contain a copy counter. If stem ends with a pattern similar to a copy counter, it appends - to stem (cf. unit test in the source code).

use std::ffi::OsString;
use std::path::PathBuf;
use tpnote_lib::filename::NotePathBuf;
use tpnote_lib::config::FILENAME_LEN_MAX;

// Test short filename.
let mut input = PathBuf::from("short filename.md");
input.shorten_filename();
let output = input;
assert_eq!(OsString::from("short filename.md"),
           output.into_os_string());

// Test too long filename.
let mut input = String::from("some/path/");
for _ in 0..(FILENAME_LEN_MAX - "long fi.ext".len()-1) {
    input.push('x');
}
let mut expected = input.clone();
input.push_str("long filename to be cut.ext");
let mut input = PathBuf::from(input);
expected.push_str("long fi.ext");

input.shorten_filename();
let output = PathBuf::from(input);
assert_eq!(PathBuf::from(expected), output);

Dyn Compatibility§

This trait is not dyn compatible.

In older versions of Rust, dyn compatibility was called "object safety", so this trait is not object safe.

Implementations on Foreign Types§

Source§

impl NotePathBuf for PathBuf

Source§

fn from_disassembled( sort_tag: &str, stem: &str, copy_counter: Option<usize>, extension: &str, ) -> Self

Source§

fn set_next_unused(&mut self) -> Result<(), FileError>

Source§

fn shorten_filename(&mut self)

Implementors§