diff --git a/Cargo.lock b/Cargo.lock index 3354901..4ac3d21 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -142,7 +142,7 @@ checksum = "5971ac85611da7067dbfcabef3c70ebb5606018acd9e2a3903a0da507521e0d5" [[package]] name = "icarus_models" -version = "0.5.6" +version = "0.6.0" dependencies = [ "josekit", "rand", diff --git a/Cargo.toml b/Cargo.toml index 3ddb8f5..122c8ac 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "icarus_models" -version = "0.5.6" +version = "0.6.0" edition = "2024" rust-version = "1.88" description = "models used for the icarus project" diff --git a/src/song.rs b/src/song.rs index 7e56349..a389f2b 100644 --- a/src/song.rs +++ b/src/song.rs @@ -1,12 +1,12 @@ use std::io::{Read, Write}; +use rand::Rng; +use serde::{Deserialize, Serialize}; + use crate::constants; use crate::init; use crate::types; -use rand::Rng; -use serde::{Deserialize, Serialize}; - #[derive(Clone, Debug, Default, Deserialize, Serialize, utoipa::ToSchema)] pub struct Song { #[serde(skip_serializing_if = "init::is_uuid_nil")] @@ -153,6 +153,7 @@ impl Song { filename } + /// Saves the song to the filesystem using the song's data pub fn save_to_filesystem(&self) -> Result<(), std::io::Error> { match self.song_path() { Ok(song_path) => match std::fs::File::create(&song_path) { @@ -169,4 +170,35 @@ impl Song { // TODO: Add function to remove file from the filesystem } -// TODO: Add function to copy song +/// I/O operations for songs +pub mod io { + /// Copies a song using the source song's data + pub fn copy_song( + song_source: &super::Song, + song_target: &mut super::Song, + ) -> Result<(), std::io::Error> { + match song_target.song_path() { + Ok(songpath) => { + let p = std::path::Path::new(&songpath); + if p.exists() { + Err(std::io::Error::other( + "Cannot copy song over to one that already exists", + )) + } else { + if song_target.data.is_empty() { + song_target.data = song_source.data.clone(); + } else { + song_target.data.clear(); + song_target.data = song_source.data.clone(); + } + + match song_target.save_to_filesystem() { + Ok(_) => Ok(()), + Err(err) => Err(err), + } + } + } + Err(err) => Err(err), + } + } +} diff --git a/tests/tests.rs b/tests/tests.rs index c6ae428..7692afa 100644 --- a/tests/tests.rs +++ b/tests/tests.rs @@ -30,16 +30,12 @@ mod utils { #[cfg(test)] mod song_tests { - use std::fs::File; - use std::io::Write; - use tempfile::tempdir; + use crate::utils; use icarus_models::song; use icarus_models::types; - use crate::utils; - #[test] fn test_song_to_data() { println!("Test"); @@ -103,50 +99,22 @@ mod song_tests { song.directory = utils::get_tests_directory(); song.filename = String::from("track01.flac"); - match song.song_path() { - Ok(songpath) => match utils::extract_data_from_file(&songpath) { - Ok(buffer) => { - let mut song_cpy = song.clone(); - let temp_dir = tempdir().expect("Failed to create temp dir"); - song_cpy.directory = match temp_dir.path().to_str() { - Some(s) => String::from(s), - None => String::new(), - }; + let mut song_cpy = song.clone(); + let temp_dir = tempdir().expect("Failed to create temp dir"); + song_cpy.directory = match temp_dir.path().to_str() { + Some(s) => String::from(s), + None => String::new(), + }; - assert_eq!(song.directory.is_empty(), false); - song_cpy.filename = - song.generate_filename(types::MusicTypes::FlacExtension, true); - println!("Directory: {:?}", song_cpy.directory); - println!("File to be created: {:?}", song_cpy.filename); + assert_eq!(song.directory.is_empty(), false); + song_cpy.filename = song.generate_filename(types::MusicTypes::FlacExtension, true); + println!("Directory: {:?}", song_cpy.directory); + println!("File to be created: {:?}", song_cpy.filename); - let path = match song_cpy.song_path() { - Ok(s_path) => s_path, - Err(err) => { - assert!(false, "Error: {:?}", err); - String::new() - } - }; - - match File::create(path) { - Ok(mut file_cpy) => match file_cpy.write_all(&buffer) { - Ok(success) => { - println!("Success: {:?}", success); - } - Err(err) => { - assert!(false, "Error saving file: {:?}", err); - } - }, - Err(err) => { - assert!(false, "Error: {:?}", err); - } - }; - } - Err(err) => { - assert!(false, "Error: {:?}", err); - } - }, + match song::copy_song(&song, &mut song_cpy) { + Ok(_) => {} Err(err) => { - assert!(false, "Error extracting song data: {:?}", err); + assert!(false, "Error copying song: Error: {err:?}") } } } @@ -157,29 +125,16 @@ mod song_tests { song.directory = utils::get_tests_directory(); song.filename = String::from("track02.flac"); - match song.song_path() { - Ok(song_path) => match utils::extract_data_from_file(&song_path) { - Ok(data) => { - let copied_song = song::Song { - directory: utils::get_tests_directory(), - filename: String::from("track02-coppied.flac"), - data: data, - ..Default::default() - }; + let mut copied_song = song::Song { + directory: utils::get_tests_directory(), + filename: String::from("track02-coppied.flac"), + ..Default::default() + }; - match copied_song.save_to_filesystem() { - Ok(_) => {} - Err(err) => { - assert!(false, "Error: {err:?}") - } - } - } - Err(err) => { - assert!(false, "Error: {err:?}") - } - }, + match song::copy_song(&song, &mut copied_song) { + Ok(_) => {} Err(err) => { - assert!(false, "Error: {err:?}"); + assert!(false, "Error: {err:?}") } } }