bevy-persistent-windows 0.9.0

A Bevy plugin to easily create and manage windows that remember where they were.
Documentation
use bevy::{
    prelude::*,
    window::PrimaryWindow,
};
use bevy_persistent::prelude::*;
use bevy_persistent_windows::prelude::*;
use std::path::{
    Path,
    PathBuf,
};

#[derive(Resource)]
struct Directories {
    state_directory: PathBuf,
}

fn main() {
    let mut app = App::new();

    let window_plugin = WindowPlugin { primary_window: None, ..Default::default() };
    app.add_plugins(DefaultPlugins.set(window_plugin).build());

    let state_directory = dirs::data_dir()
        .map(|platform_data_dir| platform_data_dir.join("bevy-persistent-windows").join("state"))
        .unwrap_or(Path::new("session").join("data").join("state"))
        .join("primary");

    app.world_mut().spawn((
        PrimaryWindow,
        PersistentWindowBundle {
            window: Window { title: "I am primary...".to_owned(), ..Default::default() },
            state: Persistent::<WindowState>::builder()
                .name("primary window state")
                .format(StorageFormat::Toml)
                .path(state_directory.join("primary-window.toml"))
                .default(WindowState::windowed(1280, 720))
                .revertible(true)
                .revert_to_default_on_deserialization_errors(true)
                .build()
                .expect("failed to create persistent primary window state"),
        },
    ));

    app.add_plugins(PersistentWindowsPlugin);

    app.insert_resource(Time::<Fixed>::from_seconds(3.0));
    app.add_systems(FixedUpdate, spawn_persistent_window);

    app.insert_resource(Directories { state_directory });

    app.run();
}

fn spawn_persistent_window(
    mut commands: Commands,
    directories: Res<Directories>,
    persistent_windows: Query<(), (With<Window>, With<Persistent<WindowState>>)>,
) {
    let persistent_window_count = persistent_windows.iter().len();
    commands.spawn(PersistentWindowBundle {
        window: Window {
            title: format!("I am #{}", persistent_window_count),
            ..Default::default()
        },
        state: Persistent::<WindowState>::builder()
            .name(format!("window #{} state", persistent_window_count))
            .format(StorageFormat::Toml)
            .path(
                directories
                    .state_directory
                    .join(format!("window-{}.toml", persistent_window_count)),
            )
            .default(WindowState::windowed(400, 400))
            .revertible(true)
            .revert_to_default_on_deserialization_errors(true)
            .build()
            .unwrap_or_else(|error| {
                panic!(
                    "failed to create the persistent window #{} state: {}",
                    persistent_window_count, error
                )
            }),
    });
}