rustfm_scraper/files/
mod.rs

1use std::env;
2use std::path::PathBuf;
3
4use anyhow::{Context, Result};
5
6use crate::models::recent_tracks::Track;
7use crate::models::saved_scrobbles::SavedScrobbles;
8
9mod csv;
10mod json;
11
12fn validate_extension(extension: &str) {
13    let valid_extensions = vec!["csv", "json"];
14
15    if !valid_extensions.contains(&extension) {
16        panic!("A valid extension was not provided.")
17    }
18}
19
20fn build_file_path(username: &str, extension: &str) -> Result<PathBuf> {
21    validate_extension(extension);
22
23    let current_dir =
24        env::current_dir().context("Error fetching current directory from environment")?;
25    Ok(current_dir.join(format!("{}.{}", username, extension)))
26}
27
28pub fn check_if_file_exists(username: &str, extension: &str) -> Result<bool> {
29    validate_extension(extension);
30
31    let file = build_file_path(username, extension)?;
32
33    Ok(file.exists())
34}
35
36pub fn find_which_file_exists(username: &str) -> Result<Option<&str>> {
37    let exists = if check_if_file_exists(username, "csv")? {
38        Some("csv")
39    } else if check_if_file_exists(username, "json")? {
40        Some("json")
41    } else {
42        None
43    };
44
45    Ok(exists)
46}
47
48pub fn save_to_file(scrobbles: &[Track], username: &str, file_format: &str) -> Result<i32> {
49    if file_format == "csv" {
50        csv::save_to_csv(scrobbles, username)
51    } else {
52        json::save_to_json(scrobbles, username)
53    }
54}
55
56pub fn append_to_file(
57    scrobbles: &[Track],
58    saved_scrobbles: &mut SavedScrobbles,
59    username: &str,
60    file_format: &str,
61) -> Result<i32> {
62    if file_format == "csv" {
63        csv::append_to_csv(scrobbles, saved_scrobbles, username)
64    } else {
65        json::append_to_json(scrobbles, saved_scrobbles, username)
66    }
67}
68
69pub fn load_from_any_file(username: &str) -> Result<SavedScrobbles> {
70    let file_format = find_which_file_exists(username)?.context("No valid file was found")?;
71    Ok(load_from_file(username, file_format)?)
72}
73
74pub fn load_from_file(username: &str, file_format: &str) -> Result<SavedScrobbles> {
75    println!(
76        "Loading saved scrobbles from `{}.{}`...",
77        username, file_format
78    );
79
80    if file_format == "csv" {
81        csv::load_from_csv(username)
82    } else {
83        json::load_from_json(username)
84    }
85}