use bevy::prelude::App;
use crate::{fuzz_runner, parse_commands, prelude::FuzzData};
use super::FuzzTarget;
use std::sync::Once;
static mut APP: Option<App> = None;
static INIT: Once = Once::new();
pub fn fuzz_bootstrap(mut app_builder: impl FuzzTarget, fuzz_bytes: &[u8]) {
if fuzz_bytes.len() == 0 {
return;
}
let fuzz_inputs = match parse_commands(fuzz_bytes.to_vec()) {
Ok(d) => d,
Err(_) => return,
};
if fuzz_inputs.len() == 0 {
return;
}
unsafe {
INIT.call_once(|| {
let mut app = App::new();
app_builder.enable_fuzzing_mode(&mut app);
APP = Some(app);
});
let app = APP.as_mut().unwrap();
app.insert_resource(FuzzData::new(fuzz_inputs));
fuzz_runner(app);
}
}