PathBuf can update path-shaped data in memory before a program decides where to write.

Program

Play the program to choose an output extension and update the report path.

extension
set_path_extension.rs
Replay: real traced execution (multi-file project)
use std::path::PathBuf;

fn main() {
    let extension = "json";
    let mut path = PathBuf::from("report.tmp");
    path.set_extension(extension);
    println!("{}", path.display());
}
use std::path::PathBuf;

fn main() {
    let extension = "csv";
    let mut path = PathBuf::from("report.tmp");
    path.set_extension(extension);
    println!("{}", path.display());
}
use std::path::PathBuf;

fn main() {
    let extension = "txt";
    let mut path = PathBuf::from("report.tmp");
    path.set_extension(extension);
    println!("{}", path.display());
}
  1. extension ← "json", path ← "report.tmp"

    3fn main() {4    let extensio→ "json"n = "json"; //@extension="json", "csv", "txt"5    let mut pat→ "report.tmp"h = PathBuf::from("report.tmp");6    path.set_extension(extension);7    println!("{}", path.display());8}
    outputreport.json
  1. extension ← "csv", path ← "report.tmp"

    3fn main() {4    let extensio→ "csv"n = "csv";5    let mut pat→ "report.tmp"h = PathBuf::from("report.tmp");6    path.set_extension(extension);7    println!("{}", path.display());8}
    outputreport.csv
  1. extension ← "txt", path ← "report.tmp"

    3fn main() {4    let extensio→ "txt"n = "txt";5    let mut pat→ "report.tmp"h = PathBuf::from("report.tmp");6    path.set_extension(extension);7    println!("{}", path.display());8}
    outputreport.txt
PathBuf `PathBuf` owns path-shaped data and can be modified.
set_extension `set_extension` replaces the filename extension in place.
model first This example models path selection without performing filesystem writes.