ayin/src/main.rs
2025-12-21 15:00:13 +02:00

87 lines
2.8 KiB
Rust

use ayin::runtime::*;
use hotwatch::{
self,
notify::event::{DataChange, ModifyKind},
};
use macroquad::prelude::*;
use std::{
sync::{Arc, RwLock},
time::Duration,
};
fn window_conf() -> Conf {
Conf {
window_title: "Ayin".to_owned(),
fullscreen: false,
window_width: SCREEN_WIDTH as i32,
window_height: SCREEN_HEIGHT as i32,
..Default::default()
}
}
#[macroquad::main(window_conf)]
async fn main() {
env_logger::init();
info!("Hello, 👁️‍🗨️!");
if screen_width() < SCREEN_WIDTH {
request_new_screen_size(SCREEN_WIDTH as f32, SCREEN_HEIGHT as f32);
}
rand::srand(macroquad::miniquad::date::now() as _);
let args: Vec<String> = std::env::args().collect();
let file = args[1].clone();
let writer = Arc::new(RwLock::new(None));
let reader = writer.clone();
let mut hotwatch = hotwatch::Hotwatch::new_with_custom_delay(Duration::from_millis(10))
.expect("hotwatch failed to initialize!");
hotwatch
.watch(file.clone(), move |event: hotwatch::Event| {
if let hotwatch::EventKind::Modify(ModifyKind::Data(DataChange::Content)) = event.kind {
match std::fs::read_to_string(file.clone()) {
Err(err) => println!("Error: {err:#?}"),
Ok(txt) => match ayin::parser::parse_file(txt) {
Err(err) => println!("Error: {err:#?}"),
Ok(program) => {
let mut w = writer.write().unwrap();
*w = Some(program);
}
},
}
}
})
.expect("failed to watch file!");
let file = args[1].clone();
match std::fs::read_to_string(file) {
Err(err) => println!("Error: {err:#?}"),
Ok(txt) => match ayin::parser::parse_file(txt) {
Err(err) => println!("Error: {err:#?}"),
Ok(program) => {
let mut state = setup(program).await;
loop {
let new_program = {
let prog = { (*(reader.read().unwrap())).clone() };
if let Some(new_program) = prog {
let mut w = reader.write().unwrap();
*w = None;
Some(new_program)
} else {
None
}
};
if let Some(new_program) = new_program {
state = migrate(state, new_program);
}
let events = fetch_events(&mut state);
update(&mut state, events);
draw(&mut state);
next_frame().await;
}
}
},
}
}