debug insanity
This commit is contained in:
parent
9d6780a0b0
commit
e5c7ed6b75
121
src/main.rs
121
src/main.rs
@ -1311,42 +1311,45 @@ async fn model_node(search_name:&str,mut file:tokio::fs::File)->AResult<CompileN
|
||||
async fn discern_node(entry:&tokio::fs::DirEntry,style:Option<DecompileStyle>)->AResult<Option<CompileNode>>{
|
||||
let contents_folder=entry.path();
|
||||
let file_name=entry.file_name();
|
||||
//folder
|
||||
Ok(if tokio::fs::try_exists(contents_folder.as_path()).await?{
|
||||
let search_name=file_name.to_str().unwrap();
|
||||
//scan inside the folder for an object to define the class of the folder
|
||||
let script_query=async {match style{
|
||||
Some(DecompileStyle::Rox)=>QuerySingle::rox(&contents_folder,search_name).resolve().await,
|
||||
Some(DecompileStyle::RoxRojo)=>QueryQuad::rox_rojo(&contents_folder,search_name).resolve().await,
|
||||
Some(DecompileStyle::Rojo)=>QueryTriple::rojo(&contents_folder).resolve().await,
|
||||
//try all three and complain if there is ambiguity
|
||||
None=>mega_triple_join(tokio::join!(
|
||||
QuerySingle::rox(&contents_folder,search_name).resolve(),
|
||||
//true=search for module here to avoid ambiguity with QuerySingle::rox results
|
||||
QueryTriple::rox_rojo(&contents_folder,search_name,true).resolve(),
|
||||
QueryTriple::rojo(&contents_folder).resolve(),
|
||||
))
|
||||
}};
|
||||
//model files are rox & rox-rojo only, so it's a lot less work...
|
||||
let model_query=get_file_async(contents_folder.clone(),format!("{}.rbxmx",search_name));
|
||||
//model? script? both?
|
||||
Some(match tokio::join!(script_query,model_query){
|
||||
(Ok(FileHint{file,hint}),Err(QueryResolveError::NotFound))=>script_node(search_name,file,hint).await?,
|
||||
(Err(QueryResolveError::NotFound),Ok(file))=>model_node(search_name,file).await?,
|
||||
(Ok(_),Ok(_))=>Err(QueryResolveError::Ambiguous)?,
|
||||
//neither
|
||||
(Err(QueryResolveError::NotFound),Err(QueryResolveError::NotFound))=>CompileNode{
|
||||
name:search_name.to_owned(),
|
||||
class:CompileClass::Folder,
|
||||
},
|
||||
//other error
|
||||
(Err(e),_)
|
||||
|(_,Err(e))=>Err(e)?
|
||||
})
|
||||
}else{
|
||||
//a folder of this name does not exist
|
||||
None
|
||||
})
|
||||
//is folder? else exit flow control
|
||||
match tokio::fs::read_dir(contents_folder.as_path()).await{
|
||||
Ok(_)=>(),//continue flow
|
||||
Err(e)=>{println!("{:?}",e.raw_os_error());match e.raw_os_error(){
|
||||
Some(0)//std::io::ErrorKind::NotFound
|
||||
|Some(20)=>return Ok(None),//std::io::ErrorKind::NotADirectory (not allowed to be used but returns it anyways)
|
||||
_=>Err(e)?,
|
||||
}}
|
||||
}
|
||||
let search_name=file_name.to_str().unwrap();
|
||||
//scan inside the folder for an object to define the class of the folder
|
||||
let script_query=async {match style{
|
||||
Some(DecompileStyle::Rox)=>QuerySingle::rox(&contents_folder,search_name).resolve().await,
|
||||
Some(DecompileStyle::RoxRojo)=>QueryQuad::rox_rojo(&contents_folder,search_name).resolve().await,
|
||||
Some(DecompileStyle::Rojo)=>QueryTriple::rojo(&contents_folder).resolve().await,
|
||||
//try all three and complain if there is ambiguity
|
||||
None=>mega_triple_join(tokio::join!(
|
||||
QuerySingle::rox(&contents_folder,search_name).resolve(),
|
||||
//true=search for module here to avoid ambiguity with QuerySingle::rox results
|
||||
QueryTriple::rox_rojo(&contents_folder,search_name,true).resolve(),
|
||||
QueryTriple::rojo(&contents_folder).resolve(),
|
||||
))
|
||||
}};
|
||||
//model files are rox & rox-rojo only, so it's a lot less work...
|
||||
let model_query=get_file_async(contents_folder.clone(),format!("{}.rbxmx",search_name));
|
||||
//model? script? both?
|
||||
Ok(Some(match tokio::join!(script_query,model_query){
|
||||
(Ok(FileHint{file,hint}),Err(QueryResolveError::NotFound))=>script_node(search_name,file,hint).await?,
|
||||
(Err(QueryResolveError::NotFound),Ok(file))=>model_node(search_name,file).await?,
|
||||
(Ok(_),Ok(_))=>Err(QueryResolveError::Ambiguous)?,
|
||||
//neither
|
||||
(Err(QueryResolveError::NotFound),Err(QueryResolveError::NotFound))=>CompileNode{
|
||||
name:search_name.to_owned(),
|
||||
class:CompileClass::Folder,
|
||||
},
|
||||
//other error
|
||||
(Err(e),_)
|
||||
|(_,Err(e))=>Err(e)?
|
||||
}))
|
||||
}
|
||||
|
||||
|
||||
@ -1359,11 +1362,11 @@ async fn discern_file(entry:&tokio::fs::DirEntry,style:Option<DecompileStyle>)->
|
||||
let path=entry.path();
|
||||
let file_discernment=match path.extension(){
|
||||
Some(extension)=>match extension.to_str(){
|
||||
Some(".lua")=>FileDiscernment::Script(ScriptHint::Undetermined),
|
||||
Some(".module.lua")=>FileDiscernment::Script(ScriptHint::ModuleScript),
|
||||
Some(".client.lua")=>FileDiscernment::Script(ScriptHint::LocalScript),
|
||||
Some(".server.lua")=>FileDiscernment::Script(ScriptHint::Script),
|
||||
Some(".rbxlx")=>FileDiscernment::Model,
|
||||
Some("lua")=>FileDiscernment::Script(ScriptHint::Undetermined),
|
||||
Some("module.lua")=>FileDiscernment::Script(ScriptHint::ModuleScript),
|
||||
Some("client.lua")=>FileDiscernment::Script(ScriptHint::LocalScript),
|
||||
Some("server.lua")=>FileDiscernment::Script(ScriptHint::Script),
|
||||
Some("rbxmx")=>FileDiscernment::Model,
|
||||
other=>Err(anyhow::Error::msg(format!("Weird file extension: {other:?}")))?,
|
||||
},
|
||||
None=>Err(anyhow::Error::msg("No file extension"))?,
|
||||
@ -1449,7 +1452,7 @@ async fn compile(config:CompileConfig)->AResult<()>{
|
||||
//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::TraverseReferent(referent)).collect();
|
||||
let mut stack:Vec<CompileStackInstruction>=dom.get_by_ref(dom.root().children()[0]).unwrap().children().into_iter().map(|&referent|CompileStackInstruction::TraverseReferent(referent)).collect();
|
||||
while let Some(instruction)=stack.pop(){
|
||||
match instruction{
|
||||
CompileStackInstruction::TraverseReferent(item_ref)=>{
|
||||
@ -1480,24 +1483,26 @@ async fn compile(config:CompileConfig)->AResult<()>{
|
||||
if !exist_names.contains(entry.file_name().to_str().unwrap()){
|
||||
let style=config.style;
|
||||
join_set.spawn(async move{
|
||||
let met=entry.metadata().await?;
|
||||
let scooby_doo=if met.is_dir(){
|
||||
discern_node(&entry,style).await
|
||||
}else{
|
||||
discern_file(&entry,style).await
|
||||
};
|
||||
//discern that bad boy
|
||||
match tokio::join!(discern_node(&entry,style),discern_file(&entry,style)){
|
||||
(Ok(Some(compile_class)),Ok(None))
|
||||
|(Ok(None),Ok(Some(compile_class)))=>{
|
||||
Ok::<_,anyhow::Error>(match scooby_doo?{
|
||||
Some(compile_class)=>{
|
||||
//prepare data structure
|
||||
match compile_class.class{
|
||||
CompileClass::Folder=>Ok(Some(PreparedData::Builder(rbx_dom_weak::InstanceBuilder::new("Folder").with_name(compile_class.name.as_str())))),
|
||||
CompileClass::Script(source)=>Ok(Some(PreparedData::Builder(script_builder("Script",compile_class.name.as_str(),source)))),
|
||||
CompileClass::LocalScript(source)=>Ok(Some(PreparedData::Builder(script_builder("LocalScript",compile_class.name.as_str(),source)))),
|
||||
CompileClass::ModuleScript(source)=>Ok(Some(PreparedData::Builder(script_builder("ModuleScript",compile_class.name.as_str(),source)))),
|
||||
CompileClass::Model(buf)=>Ok(Some(PreparedData::Model(rbx_xml::from_reader_default(std::io::Cursor::new(buf))?))),
|
||||
}
|
||||
Some(match compile_class.class{
|
||||
CompileClass::Folder=>PreparedData::Builder(rbx_dom_weak::InstanceBuilder::new("Folder").with_name(compile_class.name.as_str())),
|
||||
CompileClass::Script(source)=>PreparedData::Builder(script_builder("Script",compile_class.name.as_str(),source)),
|
||||
CompileClass::LocalScript(source)=>PreparedData::Builder(script_builder("LocalScript",compile_class.name.as_str(),source)),
|
||||
CompileClass::ModuleScript(source)=>PreparedData::Builder(script_builder("ModuleScript",compile_class.name.as_str(),source)),
|
||||
CompileClass::Model(buf)=>PreparedData::Model(rbx_xml::from_reader_default(std::io::Cursor::new(buf))?),
|
||||
})
|
||||
},
|
||||
(Ok(Some(_)),Ok(Some(_)))=>panic!("File and folder have the same name!"),
|
||||
(Ok(None),Ok(None))=>Ok(None),
|
||||
(Err(e),_)
|
||||
|(_,Err(e))=>Err(e),
|
||||
}
|
||||
None=>None,
|
||||
})
|
||||
});
|
||||
}
|
||||
}
|
||||
@ -1523,7 +1528,7 @@ async fn compile(config:CompileConfig)->AResult<()>{
|
||||
if output_place.extension().is_none()&&tokio::fs::try_exists(output_place.as_path()).await?{
|
||||
output_place.push("place.rbxl");
|
||||
}
|
||||
let output=std::io::BufWriter::new(std::fs::File::open(output_place)?);
|
||||
let output=std::io::BufWriter::new(std::fs::File::create(output_place)?);
|
||||
rbx_binary::to_writer(output,&dom,&[dom.root_ref()])?;
|
||||
Ok(())
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user