diff --git a/Cargo.lock b/Cargo.lock index 8defbb2..df0eb58 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -326,7 +326,7 @@ dependencies = [ [[package]] name = "save-op1" -version = "0.4.0" +version = "0.5.0" dependencies = [ "dialoguer", "ears", diff --git a/Cargo.toml b/Cargo.toml index 9b6191a..6b1f80b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "save-op1" -version = "0.4.0" +version = "0.5.0" authors = ["chee "] edition = "2018" diff --git a/src/copy.rs b/src/copy.rs new file mode 100644 index 0000000..3a2668f --- /dev/null +++ b/src/copy.rs @@ -0,0 +1,17 @@ +use pbr::{ProgressBar, Units}; +use std::fs::File; +use std::io::{copy, Result, Write}; +use std::path; +use tee_readwrite::TeeWriter; + +pub fn copy_file(source: &path::PathBuf, target: &path::PathBuf) -> Result<()> { + let mut source = File::open(source)?; + let bytes = source.metadata()?.len() as u64; + let mut progress_bar = ProgressBar::new(bytes); + progress_bar.set_units(Units::Bytes); + let mut target = File::create(target)?; + let mut tee = TeeWriter::new(&mut target, &mut progress_bar); + copy(&mut source, &mut tee)?; + progress_bar.finish_print("yay!"); + Ok(()) +} diff --git a/src/disk.rs b/src/disk.rs index 262c0c4..4dced35 100644 --- a/src/disk.rs +++ b/src/disk.rs @@ -1,10 +1,9 @@ +use super::copy::copy_file; use super::operator::Track; use super::song::Song; -use pbr::{ProgressBar, Units}; -use std::fs::{create_dir_all, read_dir, File}; -use std::io::{copy, Error, ErrorKind, Result}; +use std::fs::{create_dir_all, read_dir}; +use std::io::{Error, ErrorKind, Result}; use std::path; -use tee_readwrite::TeeWriter; struct SongsPath { path: String, @@ -96,18 +95,6 @@ pub struct Disk { */ } -fn copy_file(source: &path::PathBuf, target: &path::PathBuf) -> Result<()> { - let mut source = File::open(source)?; - let bytes = source.metadata()?.len() as u64; - let mut progress_bar = ProgressBar::new(bytes); - progress_bar.set_units(Units::Bytes); - let mut target = File::create(target)?; - let mut tee = TeeWriter::new(&mut target, &mut progress_bar); - copy(&mut source, &mut tee)?; - progress_bar.finish_print("done"); - Ok(()) -} - impl Disk { fn make_song_dir(&self, song: &Song) -> Result<()> { create_dir_all(self.songs.song(&SongArg::Song(song))) @@ -211,7 +198,7 @@ impl Disk { self.songs.tape_string(&SongArg::Slug(slug)) } - pub fn _track_paths(&self, slug: &str) -> Vec { + pub fn track_paths(&self, slug: &str) -> Vec { let song = &SongArg::Slug(slug); vec![ format!("{}/track_1.aif", self.songs.tape_string(song)), diff --git a/src/main.rs b/src/main.rs index e399436..22ba0d3 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,5 +1,6 @@ use ears::AudioController; use std::path; +mod copy; mod disk; mod operator; mod song; @@ -171,14 +172,18 @@ fn main_menu() -> std::io::Result { } } -fn load_tape_menu(_op1: &Operator, _disk: &Disk, song_name: &str) -> std::io::Result<()> { +fn load_tape(op1: &Operator, disk: &Disk, slug: &str) -> std::io::Result<()> { + op1.save_tape(disk.track_paths(slug)) +} + +fn load_tape_menu(op1: &Operator, disk: &Disk, slug: &str) -> std::io::Result<()> { match dialoguer::Select::new() - .with_prompt(song_name) + .with_prompt(slug) .items(&["write to op-1", "back"]) .interact() .unwrap() { - 0 => Ok(()), + 0 => load_tape(op1, disk, slug), 1 => Ok(()), _ => Ok(()), } @@ -201,7 +206,7 @@ fn save_tape(op1: &Operator, disk: &Disk) -> std::io::Result<()> { fn tape_menu(op1: &Operator, disk: &Disk) -> std::io::Result<()> { match dialoguer::Select::new() - .items(&["save", "load", "back"]) + .items(&["save to disk", "load to op-1", "back"]) .interact() .unwrap() { diff --git a/src/operator/mod.rs b/src/operator/mod.rs index a8bd660..5d150d1 100644 --- a/src/operator/mod.rs +++ b/src/operator/mod.rs @@ -1,3 +1,4 @@ +use super::copy::copy_file; use std::fs; use std::path; @@ -23,7 +24,7 @@ impl Side { match self { Side::A(path) => Some(path), Side::B(path) => Some(path), - Side::Neither => None + Side::Neither => None, } } } @@ -90,6 +91,29 @@ impl Tape { } } + pub fn save(&self, tracks: Vec) -> std::io::Result<()> { + // lol this can't be right + let disk_track_1 = path::PathBuf::from(tracks.get(0).unwrap()); + let disk_track_2 = path::PathBuf::from(tracks.get(1).unwrap()); + let disk_track_3 = path::PathBuf::from(tracks.get(2).unwrap()); + let disk_track_4 = path::PathBuf::from(tracks.get(3).unwrap()); + + let op1_track_1 = path::PathBuf::from(self.track_1.path()); + let op1_track_2 = path::PathBuf::from(self.track_2.path()); + let op1_track_3 = path::PathBuf::from(self.track_3.path()); + let op1_track_4 = path::PathBuf::from(self.track_4.path()); + + println!("writing track_1 to op1"); + copy_file(&disk_track_1, &op1_track_1)?; + println!("writing track_2 to op1"); + copy_file(&disk_track_2, &op1_track_2)?; + println!("writing track_3 to op1"); + copy_file(&disk_track_3, &op1_track_3)?; + println!("writing track_4 to op1"); + copy_file(&disk_track_4, &op1_track_4)?; + Ok(()) + } + pub fn tracks(&self) -> Vec<&Track> { return vec![&self.track_1, &self.track_2, &self.track_3, &self.track_4]; } @@ -137,6 +161,10 @@ impl Operator { return Ok(has_album && has_tape && has_drum && has_synth); } + pub fn save_tape(&self, tracks: Vec) -> std::io::Result<()> { + self.tape.save(tracks) + } + pub fn new(mount_path: &path::PathBuf) -> std::io::Result { let is_valid = Operator::check_structure(mount_path)?; let get_path = |suffix: &str| -> path::PathBuf {