use std::{fs::File, path::Path, io::{Error, ErrorKind}};
use crate::{config::Cfg, db::{db_setup, user_dbversion, create_dbversion, insert_column, get_lists, get_list, get_current_versions, insert_dl_link}, modrinth::get_raw_versions};
pub async fn setup(config: Cfg) -> Result<(), Box<dyn std::error::Error>> {
let db_file = format!("{}/data.db", String::from(&config.data));
if !Path::new(&db_file).exists() {
return create(config, db_file);
}
match user_dbversion(config.clone()) {
Ok(ver) => {
match ver.as_str() {
_ => return Err(Box::new(Error::new(ErrorKind::Other, "UNKNOWN_VERSION")))
}
},
Err(..) => to_02(config).await?
};
Ok(())
}
fn create(config: Cfg, db_file: String) -> Result<(), Box<dyn std::error::Error>> {
File::create(db_file)?;
db_setup(config)?;
Ok(())
}
async fn to_02(config: Cfg) -> Result<(), Box<dyn std::error::Error>> {
let lists = get_lists(config.clone())?;
for list in lists {
println!("Updating {}", list);
insert_column(config.clone(), String::from(&list), String::from("current_download"), String::new())?;
let full_list = get_list(config.clone(), String::from(&list))?;
let versions = get_current_versions(config.clone(), full_list.clone())?;
let raw_versions = get_raw_versions(String::from(&config.apis.modrinth), versions).await;
for ver in raw_versions {
println!("Adding link for {}", ver.project_id);
let file = ver.files.into_iter().find(|f| f.primary).unwrap();
insert_dl_link(config.clone(), full_list.clone(), ver.project_id, file.url)?;
}
};
create_dbversion(config)?;
Ok(())
}