livemod 0.5.0

Unity-like runtime modification of variables
Documentation
use std::ops::{Deref, DerefMut};

use crate::LiveMod;

pub struct LiveModHandle;

impl LiveModHandle {
    #[inline(always)]
    pub fn new_gui() -> LiveModHandle {
        LiveModHandle
    }

    #[inline(always)]
    pub fn new_with_ui(_: &str) -> LiveModHandle {
        LiveModHandle
    }

    #[inline(always)]
    pub fn track_variable<T: 'static + LiveMod>(&self, _: &str, _: &'static StaticModVar<T>) {}

    #[inline(always)]
    pub fn create_variable<T: 'static + LiveMod>(&self, _: &str, var: T) -> ModVar<T> {
        ModVar { value: var }
    }

    #[inline(always)]
    pub unsafe fn create_variable_unchecked<'a, T: 'a + LiveMod>(
        &self,
        _: &str,
        var: T,
    ) -> ModVar<T> {
        ModVar { value: var }
    }
}

#[repr(transparent)]
pub struct ModVar<T> {
    value: T,
}

impl<T> ModVar<T> {
    #[inline(always)]
    pub fn lock(&self) -> ModVarGuard<T> {
        ModVarGuard(&self.value)
    }

    #[inline(always)]
    pub fn lock_mut(&mut self) -> ModVarMutGuard<T> {
        ModVarMutGuard(&mut self.value)
    }
}

#[repr(transparent)]
pub struct StaticModVar<T> {
    value: T,
}

impl<T> StaticModVar<T> {
    pub const fn new(value: T) -> StaticModVar<T> {
        StaticModVar { value }
    }

    #[inline(always)]
    pub fn lock(&self) -> ModVarGuard<T> {
        ModVarGuard(&self.value)
    }
}

#[repr(transparent)]
pub struct ModVarGuard<'a, T>(&'a T);

impl<'a, T> Deref for ModVarGuard<'a, T> {
    type Target = T;

    fn deref(&self) -> &Self::Target {
        self.0
    }
}

#[repr(transparent)]
pub struct ModVarMutGuard<'a, T>(&'a mut T);

impl<'a, T> Deref for ModVarMutGuard<'a, T> {
    type Target = T;

    fn deref(&self) -> &Self::Target {
        self.0
    }
}

impl<'a, T> DerefMut for ModVarMutGuard<'a, T> {
    fn deref_mut(&mut self) -> &mut Self::Target {
        self.0
    }
}