#![forbid(unsafe_code)]
#![warn(clippy::all)]
use std::path::Path;
use downloaders::{
CurseDownloader, Downloader, FileDownloader, MinecraftDownloader as MD, RinthDownloader,
};
use error::{Result, UraniumError};
use log::info;
pub use mine_data_structs;
use modpack_maker::{ModpackMaker, State};
use variables::constants::*;
pub mod downloaders;
pub mod error;
pub mod modpack_maker;
pub mod searcher;
pub mod version_checker;
mod code_functions;
mod hashes;
mod variables;
mod zipper;
pub async fn make_modpack<I: AsRef<Path>, J: AsRef<Path>>(
minecraft_path: I,
modpack_name: J,
) -> Result<()> {
let mut maker = ModpackMaker::new(&minecraft_path, modpack_name);
maker.start()?;
let mut i = 0;
loop {
match maker.chunk().await {
Ok(State::Finish) => return Ok(()),
Err(e) => return Err(e),
_ => {
info!("{}", i);
i += 1;
}
}
}
}
pub async fn curse_pack_download<I: AsRef<Path>, J: AsRef<Path>>(
file_path: I,
destination_path: J,
) -> Result<()> {
let mut curse_downloader =
CurseDownloader::<Downloader>::new(&file_path, &destination_path).await?;
curse_downloader
.complete()
.await?;
Ok(())
}
pub async fn rinth_pack_download<I: AsRef<Path>, J: AsRef<Path>>(
file_path: I,
destination_path: J,
) -> Result<()> {
let mut rinth_downloader = RinthDownloader::<Downloader>::new(&file_path, &destination_path)?;
rinth_downloader
.complete()
.await?;
Ok(())
}
pub async fn download_minecraft<I: AsRef<Path>>(instance: &str, destination_path: I) -> Result<()> {
let mut minecraft_downloader = MD::<Downloader>::init(destination_path, instance).await?;
minecraft_downloader
.start()
.await?;
Ok(())
}
pub fn set_threads(t: usize) -> Option<()> {
let mut aux = NTHREADS.write().ok()?;
*aux = t;
Some(())
}
pub fn init_logger() -> Result<()> {
use std::fs::File;
use chrono::prelude::Local;
use simplelog::{
ColorChoice, CombinedLogger, Config, LevelFilter, TermLogger, TerminalMode, WriteLogger,
};
let home_dir = dirs::home_dir().ok_or(UraniumError::OtherWithReason(
"Cant get user home directory".to_string(),
))?;
let log_file_name = home_dir
.join(".uranium")
.join(format!("log_{}", Local::now().format("%H-%M-%S_%d-%m-%Y")));
let latest_log_file = home_dir
.join(".uranium")
.join("latest_log_file.txt");
CombinedLogger::init(vec![
TermLogger::new(
LevelFilter::Info,
Config::default(),
TerminalMode::Mixed,
ColorChoice::Auto,
),
WriteLogger::new(
LevelFilter::Info,
Config::default(),
File::create(log_file_name)?,
),
WriteLogger::new(
LevelFilter::Info,
Config::default(),
File::create(latest_log_file)?,
),
])
.unwrap();
Ok(())
}
#[cfg(test)]
mod tests {}