use crate::runtime::Compatibility;
use crate::runtime::ReloadPhase;
use crate::types::LogLevel;
use crate::types::StringView;
#[repr(C)]
#[derive(Debug, Clone)]
pub struct RuntimeConfig {
pub compatibility: Compatibility,
pub hot_reload_enabled: bool,
pub on_reload: Option<unsafe extern "C" fn(*mut core::ffi::c_void, *const ReloadPhase)>,
pub on_reload_user_data: *mut core::ffi::c_void,
pub log: Option<unsafe extern "C" fn(*mut core::ffi::c_void, u32, StringView, StringView)>,
pub log_user_data: *mut core::ffi::c_void,
pub log_max_level: u32,
}
unsafe impl Send for RuntimeConfig {}
unsafe impl Sync for RuntimeConfig {}
impl Default for RuntimeConfig {
fn default() -> Self {
Self {
compatibility: Compatibility::Strict,
hot_reload_enabled: false,
on_reload: None,
on_reload_user_data: core::ptr::null_mut(),
log: None,
log_user_data: core::ptr::null_mut(),
log_max_level: LogLevel::Warn as u32,
}
}
}
#[cfg(test)]
mod tests {
use core::mem::{align_of, offset_of, size_of};
use super::RuntimeConfig;
use crate::runtime::Compatibility;
use crate::types::LogLevel;
#[test]
fn layout_runtime_config() {
assert_eq!(size_of::<RuntimeConfig>(), 48);
assert_eq!(align_of::<RuntimeConfig>(), 8);
assert_eq!(offset_of!(RuntimeConfig, compatibility), 0x0);
assert_eq!(offset_of!(RuntimeConfig, hot_reload_enabled), 0x4);
assert_eq!(offset_of!(RuntimeConfig, on_reload), 0x8);
assert_eq!(offset_of!(RuntimeConfig, on_reload_user_data), 0x10);
assert_eq!(offset_of!(RuntimeConfig, log), 0x18);
assert_eq!(offset_of!(RuntimeConfig, log_user_data), 0x20);
assert_eq!(offset_of!(RuntimeConfig, log_max_level), 0x28);
}
#[test]
fn option_fn_pointer_niche_keeps_layout() {
assert_eq!(
size_of::<
Option<
unsafe extern "C" fn(
*mut core::ffi::c_void,
*const crate::runtime::ReloadPhase,
),
>,
>(),
size_of::<
unsafe extern "C" fn(*mut core::ffi::c_void, *const crate::runtime::ReloadPhase),
>(),
);
assert_eq!(
size_of::<
Option<
unsafe extern "C" fn(
*mut core::ffi::c_void,
u32,
crate::types::StringView,
crate::types::StringView,
),
>,
>(),
size_of::<*const core::ffi::c_void>(),
);
}
#[test]
fn default_runtime_config() {
let config = RuntimeConfig::default();
assert_eq!(config.compatibility, Compatibility::Strict);
assert!(!config.hot_reload_enabled);
assert!(config.on_reload.is_none());
assert!(config.on_reload_user_data.is_null());
assert!(config.log.is_none());
assert!(config.log_user_data.is_null());
assert_eq!(config.log_max_level, LogLevel::Warn as u32);
}
}