sinelaw/fresh · error

No file path associated with buffer

Error message

No file path associated with buffer

What it means

Buffer::save persists the buffer to the file it is associated with. If the buffer has no file path (an untitled/scratch buffer, or one created from in-memory content), saving via save() is impossible, so it bails with an io::Error of kind NotFound carrying "No file path associated with buffer". The caller must instead use an explicit save-as flow with a chosen path.

Solutions

  1. Check buffer.persistence.file_path_owned() (or an equivalent has_path check) before calling save().
  2. Route pathless buffers to a Save As flow: prompt for a path and call save_to_file(path) instead of save().
  3. If the buffer should have a path, associate one first via the appropriate file-loading/attachment API.

Example fix

// before
buffer.save()?; // panics/bails for untitled buffers

// after
match buffer.persistence.file_path_owned() {
    Some(_) => buffer.save()?,
    None => {
        let path = prompt_save_as();
        buffer.save_to_file(path)?;
    }
}
Defensive patterns

Strategy: validation

Validate before calling

// Rust: verify the buffer has a path before saving
let can_save = buffer.persistence.file_path_owned().is_some();

Try / catch

match buffer.save() {
    Err(e) if e.to_string().contains("No file path associated with buffer") => {
        let path = prompt_save_as()?;
        buffer.save_to_file(path)?;
    }
    other => other?,
}

Prevention

When it happens

Trigger: Calling buffer.save() on a buffer whose persistence.file_path_owned() returns None — i.e. a new untitled buffer, a scratch/clipboard buffer, or any buffer created without load_file/save_to_file ever having associated a path.

Common situations: User presses Ctrl+S in an untitled document without having done Save As; automation/tests constructing a Buffer directly and calling save(); buffers whose path association was cleared after a failed rename/move.

Understand the failure class

Background: "File not found" and ENOENT errors: why libraries can't find a file that should exist — this error's family across 50 libraries.

Related errors


AI-assisted analysis of sinelaw/fresh@67894ca546 (2026-09-13). Data as JSON: /api/errors/d58b9a4cac88424c. Report an issue: GitHub.

Appendix: source

Thrown at crates/fresh-editor-core/src/model/buffer/mod.rs:730

            persistence: Persistence::new(
                fs,
                Some(path.to_path_buf()),
                saved_root,
                Some(file_size),
            ),
            file_kind: BufferFileKind::new(true, is_binary),
            format: BufferFormat::new(line_ending, encoding),
            version: 0,
            config: BufferConfig::default(),
        })
    }

    /// Save the buffer to its associated file
    pub fn save(&mut self) -> anyhow::Result<()> {
        if let Some(path) = self.persistence.file_path_owned() {
            self.save_to_file(path)
        } else {
            anyhow::bail!(io::Error::new(
                io::ErrorKind::NotFound,
                "No file path associated with buffer",
            ))
        }
    }

    /// Build a write recipe from the piece tree for saving.
    ///
    /// Delegates to `save::build_write_recipe`.
    #[cfg(test)]
    pub(crate) fn build_write_recipe(&self) -> io::Result<WriteRecipe> {
        save::build_write_recipe(
            &self.piece_tree,
            &self.buffers,
            &self.format,
            &self.file_kind,
            &self.persistence,
        )

View on GitHub (pinned to 67894ca546)