rebound-rs 4.6.0-alpha.1

Rust wrapper for the REBOUND N-body simulation library.
Documentation
use rebound_bind as rb;

#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Type {
    Lf = rb::REB_EOS_TYPE_REB_EOS_LF as isize,
    Lf4 = rb::REB_EOS_TYPE_REB_EOS_LF4 as isize,
    Lf6 = rb::REB_EOS_TYPE_REB_EOS_LF6 as isize,
    Lf8 = rb::REB_EOS_TYPE_REB_EOS_LF8 as isize,
    Lf42 = rb::REB_EOS_TYPE_REB_EOS_LF4_2 as isize,
    Lf864 = rb::REB_EOS_TYPE_REB_EOS_LF8_6_4 as isize,
    Plf764 = rb::REB_EOS_TYPE_REB_EOS_PLF7_6_4 as isize,
    Pmlf4 = rb::REB_EOS_TYPE_REB_EOS_PMLF4 as isize,
    Pmlf6 = rb::REB_EOS_TYPE_REB_EOS_PMLF6 as isize,
}

impl From<Type> for rb::REB_EOS_TYPE {
    fn from(value: Type) -> Self {
        match value {
            Type::Lf => rb::REB_EOS_TYPE_REB_EOS_LF,
            Type::Lf4 => rb::REB_EOS_TYPE_REB_EOS_LF4,
            Type::Lf6 => rb::REB_EOS_TYPE_REB_EOS_LF6,
            Type::Lf8 => rb::REB_EOS_TYPE_REB_EOS_LF8,
            Type::Lf42 => rb::REB_EOS_TYPE_REB_EOS_LF4_2,
            Type::Lf864 => rb::REB_EOS_TYPE_REB_EOS_LF8_6_4,
            Type::Plf764 => rb::REB_EOS_TYPE_REB_EOS_PLF7_6_4,
            Type::Pmlf4 => rb::REB_EOS_TYPE_REB_EOS_PMLF4,
            Type::Pmlf6 => rb::REB_EOS_TYPE_REB_EOS_PMLF6,
        }
    }
}

impl Type {
    fn from_raw(value: rb::REB_EOS_TYPE) -> Option<Self> {
        match value {
            rb::REB_EOS_TYPE_REB_EOS_LF => Some(Self::Lf),
            rb::REB_EOS_TYPE_REB_EOS_LF4 => Some(Self::Lf4),
            rb::REB_EOS_TYPE_REB_EOS_LF6 => Some(Self::Lf6),
            rb::REB_EOS_TYPE_REB_EOS_LF8 => Some(Self::Lf8),
            rb::REB_EOS_TYPE_REB_EOS_LF4_2 => Some(Self::Lf42),
            rb::REB_EOS_TYPE_REB_EOS_LF8_6_4 => Some(Self::Lf864),
            rb::REB_EOS_TYPE_REB_EOS_PLF7_6_4 => Some(Self::Plf764),
            rb::REB_EOS_TYPE_REB_EOS_PMLF4 => Some(Self::Pmlf4),
            rb::REB_EOS_TYPE_REB_EOS_PMLF6 => Some(Self::Pmlf6),
            _ => None,
        }
    }
}

pub struct IntegratorEos<'a> {
    pub(crate) inner: *mut rb::reb_integrator_eos,
    pub(crate) _marker: core::marker::PhantomData<&'a mut rb::reb_simulation>,
}

impl<'a> IntegratorEos<'a> {
    pub fn set_phi0(self, phi0: Type) -> Self {
        unsafe {
            (*self.inner).phi0 = phi0.into();
        }
        self
    }

    pub fn set_phi1(self, phi1: Type) -> Self {
        unsafe {
            (*self.inner).phi1 = phi1.into();
        }
        self
    }

    pub fn set_n(self, n: u32) -> Self {
        unsafe {
            (*self.inner).n = n;
        }
        self
    }

    pub fn set_safe_mode(self, safe_mode: u32) -> Self {
        unsafe {
            (*self.inner).safe_mode = safe_mode;
        }
        self
    }

    pub fn phi0(&self) -> Option<Type> {
        unsafe { Type::from_raw((*self.inner).phi0) }
    }

    pub fn phi1(&self) -> Option<Type> {
        unsafe { Type::from_raw((*self.inner).phi1) }
    }

    pub fn n(&self) -> u32 {
        unsafe { (*self.inner).n }
    }

    pub fn safe_mode(&self) -> u32 {
        unsafe { (*self.inner).safe_mode }
    }
}