use super::{ffi, queue::QueueRef, solvable::SolvableId, solver::Solver};
use std::{marker::PhantomData, ptr::NonNull};
pub struct Transaction<'solver>(
NonNull<ffi::Transaction>,
PhantomData<&'solver Solver<'solver>>,
);
impl Drop for Transaction<'_> {
fn drop(&mut self) {
unsafe { ffi::transaction_free(self.0.as_mut()) }
}
}
impl Transaction<'_> {
pub(super) unsafe fn new<'a>(
_solver: &'a Solver<'a>,
ptr: NonNull<ffi::Transaction>,
) -> Transaction<'a> {
Transaction(ptr, PhantomData)
}
fn raw_ptr(&self) -> *mut ffi::Transaction {
self.0.as_ptr()
}
pub fn as_ref(&self) -> &ffi::Transaction {
unsafe { self.0.as_ref() }
}
pub fn transaction_type(&self, solvable_id: SolvableId) -> ffi::Id {
unsafe {
ffi::transaction_type(
self.raw_ptr(),
solvable_id.into(),
ffi::SOLVER_TRANSACTION_SHOW_ALL as std::os::raw::c_int,
)
}
}
pub unsafe fn obs_pkg(&self, solvable_id: SolvableId) -> SolvableId {
SolvableId(unsafe { ffi::transaction_obs_pkg(self.raw_ptr(), solvable_id.into()) })
}
pub fn get_steps(&self) -> QueueRef<'_> {
unsafe { QueueRef::from_ffi_queue(self, self.as_ref().steps) }
}
}