root/src/download.rs

use std::path::Path;
use std::path::PathBuf;

fn init_download_path() -> Option<PathBuf> {
    let mut path = gtk::glib::user_data_dir();
    path.push("boorus");
    path.push("images");
    std::fs::create_dir_all(&path).ok()?;
    Some(path)
}

pub fn download_read_path(filename: String) -> PathBuf {
    let mut path = gtk::glib::user_data_dir();
    path.push("boorus");
    path.push("images");
    path.push(filename);
    path
}

pub fn thumb_write_path(filename: &str) -> Option<PathBuf> {
    let mut path = gtk::glib::user_data_dir();
    path.push("boorus");
    path.push("thumbs");
    std::fs::create_dir_all(&path).ok()?;
    path.push(filename);
    path.set_extension("png");
    Some(path)
}

pub fn thumb_read_path(filename: &str) -> PathBuf {
    let mut path = gtk::glib::user_data_dir();
    path.push("boorus");
    path.push("thumbs");
    path.push(filename);
    path.set_extension("png");
    path
}

pub fn save_image(filename: &Path, bytes: &bytes::Bytes) -> Option<PathBuf> {
    let mut path = init_download_path()?;
    path.push(filename.file_name()?);
    std::fs::write(&path, bytes).ok()?;
    path.file_name().map(PathBuf::from)
}

/// Returns relative path
pub fn save_thumb(filename: &Path, thumb: Option<gtk::gdk::Texture>) -> Option<PathBuf> {
    if let Some(thumb) = thumb {
        use adw::prelude::TextureExt;
        let bytes = thumb.save_to_png_bytes();
        let thumb_path = filename
            .file_name()
            .and_then(|o| o.to_str())
            .and_then(crate::download::thumb_write_path);
        if let Some(thumb_path) = thumb_path.as_ref() {
            std::fs::write(thumb_path, bytes).ok()?;
        }
        thumb_path?.file_name().map(PathBuf::from)
    } else {
        None
    }
}