extern {
  fn run_node();
}

fn main() {
  println!("a surprise to be sure, but a welcome one");
  unsafe { run_node(); }
}

// mod libnode;
// mod sys;
// mod node_start;

// use std::ffi::{c_char, CString};

// fn main() -> anyhow::Result<()> {
//   node_start::node_start(&[
//     "--no-warnings=ExperimentalWarning".to_string(), 
//     "/root/development/scratch/cpp/test.js".to_string(),
//   ]);

//   Ok(())
// }

// fn main() -> anyhow::Result<()> {
//   unsafe {
//     let libnode = libloading::Library::new("/root/development/alshdavid/libnode/node/out/Release/libnode.so.131")?;
//     let node_start = libnode.get::<libnode_start>(b"node_start\0")?;
//     println!("{:?}", node_start);
//     // let mut result = &std::ptr::null_mut();

//     let cstr_argv: Vec<CString> = [
//       "".to_string(),
//       "/root/development/scratch/cpp/test.js".to_string(),
//     ].iter()
//         .map(|arg: &String| CString::new(arg.as_str()).unwrap())
//         .collect();

//     let mut p_argv: Vec<_> = cstr_argv.iter() // do NOT into_iter()
//             .map(|arg| arg.as_ptr())
//             .collect();

//     p_argv.push(std::ptr::null());

//     let p: *const *const c_char = p_argv.as_ptr();
//     node_start(2, p);
//   };

//   Ok(())
// }

// NODE_EXTERN int Start(int argc, char* argv[]);
// type libnode_start = unsafe fn(argc: i32, *const *const c_char);//, *const c_char);