rustfm_scraper/files/
mod.rs1use 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}