use std::{error::Error, fs::OpenOptions, path::{Path, PathBuf}};
use ygen::{debug::Lang, prelude::*, Support::ColorProfile, Target::initializeAllTargets};
pub fn main() -> Result<(), Box<dyn Error>> {
let mut module = Module();
module.init_dbg("ygen example".to_owned(), Lang::C, &PathBuf::from("hello_world.c"));
let mut builder = IRBuilder();
let other = module.add("printf", &FnTy(vec![TypeMetadata::ptr], TypeMetadata::Void));
other.import();
let other = other.clone();
let string = module.addConst("str");
string.set("Hello World!\n\0".as_bytes().to_vec());
let string = string.clone();
let ty = FnTy(vec![], TypeMetadata::Void);
let func = module.add(
"main", &ty
);
func.extrn();
let entry = func.addBlock("entry");
builder.positionAtEnd(entry);
builder.BuildDebug(4, 0, PathBuf::from("hello_world.c"));
let string = builder.BuildAssign(&string);
builder.BuildCall( &other, vec![string] );
builder.BuildDebug(5, 0, PathBuf::from("hello_world.c"));
builder.BuildRet( Type::Void );
module.verify()?;
eprintln!(
"{}", module.dumpColored(ColorProfile::default())
);
let triple = Triple::host();
module.emitToAsmFile(
triple,
&mut initializeAllTargets(triple)?,
Path::new("out.o")
)?;
let (mut object, debug) = module
.emitMachineCode(
triple,
&mut initializeAllTargets(triple)?,
true )?;
object.debug = true;
object.emit(
OpenOptions::new().write(true).create(true).open("out.o")?,
debug
)?;
Ok(())
}