diff options
Diffstat (limited to 'src/main.rs')
-rw-r--r-- | src/main.rs | 249 |
1 files changed, 249 insertions, 0 deletions
diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..8e4e225 --- /dev/null +++ b/src/main.rs @@ -0,0 +1,249 @@ +use clap::{Parser, Subcommand}; +use std::path::{Path, PathBuf}; +use std::fs::write; +use std::process::exit; +use std::fs; +use json; + +mod content; +mod utils; + +#[derive(Parser)] +struct Cli { + #[clap(subcommand)] + command: Commands, +} + +#[derive(Subcommand)] +enum Commands { + Init { + }, + + /// Install new addon + Install { + /// Addon project git + git_repo: String + }, + + Update { + }, + + Remove { + }, +} + +#[derive(Clone)] +#[derive(Debug)] +struct GlamObject { + name : String, + git_repo : String +} + +fn main() { + let cli = Cli::parse(); + + match &cli.command { + Commands::Init {} => { + initialize(); + }, + + Commands::Install {git_repo: git_address} => { + check_initialization(); + install_addon(git_address); + }, + + Commands::Update {} => { + check_initialization(); + update_addon(); + }, + + Commands::Remove {} => { + check_initialization(); + remove_addon(); + }, + } +} + +fn initialize() { + if !Path::new("./.gitignore").exists() { + match write("./.gitignore", content::create_gitignore_file()) { + Ok(_v) => (), + Err(_e) => { + println!("There was a problem creating the .gitignore file!"); + exit(1); + } + } + } + + if !Path::new("./.gdignore").exists() { + match write("./.gdignore", content::create_gdignore_file()) { + Ok(_v) => (), + Err(_e) => { + println!("There was a problem creating the .gdignore file!"); + exit(1); + } + } + } +} + +fn check_initialization() { + if !Path::new("./.gitignore").exists() { + println!(".gitignore file does not exist!"); + } + if !Path::new("./.gdignore").exists() { + println!(".gdignore file does not exist!"); + } +} + +fn install_addon(git_repo : &str) { + + // Search for project root folder + let root = search_project_root(); + println!("Found root project in: {}", root); + + // Create glam.d/ folder if it doesn't exist + if !Path::new(&format!("{}/.glam.d/", root)).exists() { + utils::run_shell_command( + &format!("mkdir -p {}/.glam.d/", root), + None + ); + } + + // Create .glam file if it doesn't exist + if !Path::new(&format!("{}/.glam", root)).exists() { + fs::write(&format!("{}/.glam",root), + content::create_glam_file()) + .expect("Couldn't create .glam file!"); + } + + // Find glam object or create one with default configuration + let mut glam_objects = read_glam_file(); + let mut glam_obj : Option<GlamObject> = None; + let name = utils::get_repo_name(git_repo); + + for obj in glam_objects.iter() { + if obj.name == name { + glam_obj = Some(obj.clone()); + } + } + + match glam_obj { + None => { + let obj = GlamObject{ + git_repo : git_repo.to_string(), + name : name.to_string() + }; + + glam_obj = Some(obj.clone()); + glam_objects.push(obj); + } + + _ => {} + } + + let target_obj = glam_obj.unwrap(); + + // If glam addon folder doesn't exist, clone project + if !Path::new(&format!("{}/.glam.d/{}", root, target_obj.name)).exists() { + utils::run_shell_command( + &format!("cd {}/.glam.d/ && git clone {} {}", root, target_obj.git_repo, target_obj.name), + None + ); + println!("Created addon folder on .glam.d!"); + } else { + println!("Not Created!"); + } + + // If project addon folder doesn't exist, create it + utils::run_shell_command( + &format!("mkdir -p {}/addons/{}", root, name), + None + ); + + // TODO: use source_folder to copy files from (default: /addons/) + // TODO: use target_folder to copy files to (defautl: (root)/) + // Copy addon repository content to target folder + utils::run_shell_command( + &format!("cp -f -r {}/.glam.d/{}/addons/* -t {}/addons/",root, name, root), + None + ); + + // Write .glam file + write_glam_file(&glam_objects); +} + +// TODO: Use root folder +fn read_glam_file() -> Vec<GlamObject> { + if !Path::new("./.glam").exists() { + fs::write("./.glam", content::create_glam_file()).expect("Couldn't create .glam file!"); + } + + let glam_content = fs::read_to_string("./.glam").expect("Couldn't read .glam file!"); + let glam_obj = json::parse(&glam_content).expect("Couldn't parse .glam file!"); + + let packages = &glam_obj["packages"]; + + let mut glam_objects = Vec::new(); + + println!("{}", packages); + for i in packages.entries() { + println!("{}", i.1); + glam_objects.push( + GlamObject{ + name : i.1["name"].to_string(), + git_repo : i.1["git_repo"].to_string() + } + ); + } + + return glam_objects; +} + +// TODO: Use root folder +fn write_glam_file(glam_objects : &Vec<GlamObject>) { + let mut data = json::object!{}; + data["packages"] = json::object!{}; + + for glam_obj in glam_objects { + println!("{:?}", glam_obj); + data["packages"][&glam_obj.name] = json::object!{}; + data["packages"][&glam_obj.name]["name"] = glam_obj.clone().name.into(); + data["packages"][&glam_obj.name]["git_repo"] = glam_obj.clone().git_repo.into(); + } + + let json_string = json::stringify(data); + + println!("{}", json_string); + fs::write("./.glam", json_string).expect("Couldn't create .glam file!"); +} + +fn update_addon() { +} + +fn remove_addon() { +} + +fn search_project_root() -> String{ + let path = PathBuf::from("./"); + let mut dir = path.canonicalize().unwrap(); + + loop { + let dir_path = dir.to_str().unwrap(); + let proj_path = format!("{}/project.godot", dir_path); + println!("{}", proj_path); + let godot_project = Path::new(&proj_path); + + if godot_project.exists() { + break; + } + else { + let parent = dir.parent(); + if parent.is_none() { + panic!("Godot project not found!"); + } + dir = dir.parent().unwrap().to_path_buf(); + } + } + + return dir.to_str().unwrap().to_string(); +} |