wip compile

This commit is contained in:
Quaternions 2024-01-22 12:28:58 -08:00
parent 48ab23bae5
commit 7e27b378e9

View File

@ -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<u8>),
}
struct CompileNode{
folder:Option<tokio::fs::ReadDir>,
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<std::path::PathBuf>,
}
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<CompileStackInstruction>=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(())
}