rustfm-scraper 0.2.23

Scrapes listening history from Last.fm and stores it in a file
Documentation
use std::env;
use std::path::PathBuf;

use anyhow::{Context, Result};

use crate::models::recent_tracks::Track;
use crate::models::saved_scrobbles::SavedScrobbles;

mod csv;
mod json;

fn validate_extension(extension: &str) {
    let valid_extensions = vec!["csv", "json"];

    if !valid_extensions.contains(&extension) {
        panic!("A valid extension was not provided.")
    }
}

fn build_file_path(username: &str, extension: &str) -> Result<PathBuf> {
    validate_extension(extension);

    let current_dir =
        env::current_dir().context("Error fetching current directory from environment")?;
    Ok(current_dir.join(format!("{}.{}", username, extension)))
}

pub fn check_if_file_exists(username: &str, extension: &str) -> Result<bool> {
    validate_extension(extension);

    let file = build_file_path(username, extension)?;

    Ok(file.exists())
}

pub fn find_which_file_exists(username: &str) -> Result<Option<&str>> {
    let exists = if check_if_file_exists(username, "csv")? {
        Some("csv")
    } else if check_if_file_exists(username, "json")? {
        Some("json")
    } else {
        None
    };

    Ok(exists)
}

pub fn save_to_file(scrobbles: &[Track], username: &str, file_format: &str) -> Result<i32> {
    if file_format == "csv" {
        csv::save_to_csv(scrobbles, username)
    } else {
        json::save_to_json(scrobbles, username)
    }
}

pub fn append_to_file(
    scrobbles: &[Track],
    saved_scrobbles: &mut SavedScrobbles,
    username: &str,
    file_format: &str,
) -> Result<i32> {
    if file_format == "csv" {
        csv::append_to_csv(scrobbles, saved_scrobbles, username)
    } else {
        json::append_to_json(scrobbles, saved_scrobbles, username)
    }
}

pub fn load_from_any_file(username: &str) -> Result<SavedScrobbles> {
    let file_format = find_which_file_exists(username)?.context("No valid file was found")?;
    Ok(load_from_file(username, file_format)?)
}

pub fn load_from_file(username: &str, file_format: &str) -> Result<SavedScrobbles> {
    println!(
        "Loading saved scrobbles from `{}.{}`...",
        username, file_format
    );

    if file_format == "csv" {
        csv::load_from_csv(username)
    } else {
        json::load_from_json(username)
    }
}