use crate::libdeno::deno_set_v8_flags;
use libc::c_char;
use libc::c_int;
use std::ffi::CStr;
use std::ffi::CString;
use std::mem;
use std::vec::Vec;
pub fn v8_set_flags(args: Vec<String>) -> Vec<String> {
let (args, rest) = v8_set_flags_preprocess(args);
let mut raw_argv = args
.iter()
.map(|arg| CString::new(arg.as_str()).unwrap().into_bytes_with_nul())
.collect::<Vec<_>>();
let mut c_argv = raw_argv
.iter_mut()
.map(|arg| arg.as_mut_ptr() as *mut c_char)
.collect::<Vec<_>>();
let mut c_argv_len = c_argv.len() as c_int;
unsafe { deno_set_v8_flags(&mut c_argv_len, c_argv.as_mut_ptr()) };
c_argv.truncate(c_argv_len as usize);
c_argv
.iter()
.map(|ptr| unsafe {
let cstr = CStr::from_ptr(*ptr as *const c_char);
let slice = cstr.to_str().unwrap();
slice.to_string()
}).chain(rest.into_iter())
.collect()
}
fn v8_set_flags_preprocess(args: Vec<String>) -> (Vec<String>, Vec<String>) {
let (rest, mut v8_args) =
args.into_iter().partition(|ref a| a.as_str() == "--help");
for a in &mut v8_args {
if a == "--v8-options" {
mem::swap(a, &mut String::from("--help"));
}
}
(v8_args, rest)
}
#[test]
fn test_v8_set_flags_preprocess_1() {
let js_args = v8_set_flags_preprocess(vec![
"deno".to_string(),
"--v8-options".to_string(),
]);
assert_eq!(
js_args,
(vec!["deno".to_string(), "--help".to_string()], vec![])
);
}
#[test]
fn test_v8_set_flags_preprocess_2() {
let js_args =
v8_set_flags_preprocess(vec!["deno".to_string(), "--help".to_string()]);
assert_eq!(
js_args,
(vec!["deno".to_string()], vec!["--help".to_string()])
);
}