Ygen 0.1.2

Yet another code generation libary like LLVM
Documentation
use std::{error::Error, fs::OpenOptions, path::Path};
use ygen::{prelude::*, Support::ColorProfile, Target::initializeAllTargets};


pub fn main() -> Result<(), Box<dyn Error>> {
    let mut module = Module();

    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); 

    let string = builder.BuildAssign(&string);
    builder.BuildCall( &other, vec![string] );

    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")
    )?;

    module
        .emitMachineCode(
            triple, 
            &mut initializeAllTargets(triple)?,
            false
        )?.0.emit(
            OpenOptions::new().write(true).create(true).open("out.o")?, None
    )?;

    Ok(())
}