diff --git a/src/main.rs b/src/main.rs index b61a306..b83ae55 100644 --- a/src/main.rs +++ b/src/main.rs @@ -163,7 +163,11 @@ async fn main()->AResult<()>{ }).collect() ).await, Commands::Upload=>upload_list(cookie.unwrap(),cli.group,vec![(cli.asset_id.unwrap(),cli.output.unwrap())]).await, - Commands::Compile=>compile(cli.input.unwrap(),cli.output.unwrap()), + Commands::Compile=>compile(CompileConfig{ + input_folder:cli.input.unwrap(), + output_file:cli.output.unwrap(), + template:None, + }), Commands::Decompile=>decompile(DecompileConfig{ style:decompile_style.unwrap(), input_file:cli.input.unwrap(), @@ -1080,6 +1084,87 @@ async fn download_and_decompile_history_into_git(config:DownloadAndDecompileHist Ok(()) } -fn compile(_folder:std::path::PathBuf,_file:std::path::PathBuf)->AResult<()>{ +enum CompileClass{ + Folder, + Script(String), + LocalScript(String), + ModuleScript(String), + Model(Vec), +} + +struct CompileNode{ + folder:Option, + class:CompileClass, +} + +enum CompileStackInstruction{ + Referent(rbx_dom_weak::types::Ref), + PushFolder(String), + PopFolder, +} + +struct CompileConfig{ + input_folder:std::path::PathBuf, + output_file:std::path::PathBuf, + template:Option, +} + +fn compile(config:CompileConfig)->AResult<()>{ + //basically decompile in reverse order + //load template dom + let input={ + let template_path=config.template.unwrap_or_else(||{ + let mut template_path=config.input_folder.clone(); + template_path.push("template.rbxlx"); + template_path + }); + std::io::BufReader::new(std::fs::File::open(template_path)?) + }; + let mut dom=load_dom(input)?; + + //add in scripts and models + let mut folder=config.input_folder.clone(); + folder.push("src"); + let mut stack:Vec=dom.root().children().into_iter().map(|&referent|CompileStackInstruction::Referent(referent)).collect(); + while let Some(instruction)=stack.pop(){ + match instruction{ + CompileStackInstruction::Referent(item_ref)=>{ + let item=dom.get_by_ref(item_ref).ok_or(anyhow::Error::msg("null child ref"))?; + //check if item exists in folder or subfolder of same name + let what=||async{ + //figure out something clever for this + + let mut what=CompileNode{ + class:CompileClass::Folder, + folder:None, + }; + let mut contents_folder=folder.clone(); + contents_folder.push(item.name.as_str()); + //folder + if let Ok(dir)=tokio::fs::read_dir(contents_folder.as_path()).await{ + what.folder=Some(dir); + }else{ + contents_folder.pop(); + } + //tokio::join!(a,b,c); + //rox + let mut rox_path=contents_folder.clone(); + rox_path.push(format!("{}.lua",item.name.as_str())); + if let Ok(file)=tokio::fs::File::open(rox_path).await{ + //CompileClass::ModuleScript + } + //rox-rojo + //rojo + }; + //push child objects onto dom + //push dom children objects onto stack + stack.push(CompileStackInstruction::PopFolder); + stack.extend(item.children().into_iter().map(|&referent|CompileStackInstruction::Referent(referent))); + stack.push(CompileStackInstruction::PushFolder(sanitize(item.name.as_str()).to_string())); + }, + CompileStackInstruction::PushFolder(component)=>folder.push(component), + CompileStackInstruction::PopFolder=>assert!(folder.pop(),"pop folder bad"), + } + } Ok(()) }