use crate::sys;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct LogAutoOpenDepth(Option<u32>);
impl LogAutoOpenDepth {
pub const DEFAULT: Self = Self(None);
#[inline]
pub const fn new(depth: u32) -> Self {
assert!(
depth <= i32::MAX as u32,
"LogAutoOpenDepth::new() depth exceeded i32::MAX"
);
Self(Some(depth))
}
#[inline]
pub(crate) const fn raw(self) -> i32 {
match self.0 {
Some(depth) => depth as i32,
None => -1,
}
}
}
impl From<u32> for LogAutoOpenDepth {
fn from(depth: u32) -> Self {
Self::new(depth)
}
}
impl crate::ui::Ui {
#[doc(alias = "LogToTTY")]
pub fn log_to_tty(&self, auto_open_depth: impl Into<LogAutoOpenDepth>) {
unsafe { sys::igLogToTTY(auto_open_depth.into().raw()) }
}
#[doc(alias = "LogToFile")]
pub fn log_to_file_default(&self, auto_open_depth: impl Into<LogAutoOpenDepth>) {
unsafe { sys::igLogToFile(auto_open_depth.into().raw(), std::ptr::null()) }
}
#[doc(alias = "LogToFile")]
pub fn log_to_file(
&self,
auto_open_depth: impl Into<LogAutoOpenDepth>,
filename: &std::path::Path,
) -> crate::error::ImGuiResult<()> {
use crate::error::SafeStringConversion;
let cstr = filename.to_string_lossy().into_owned().to_cstring_safe()?;
unsafe { sys::igLogToFile(auto_open_depth.into().raw(), cstr.as_ptr()) }
Ok(())
}
#[doc(alias = "LogToClipboard")]
pub fn log_to_clipboard(&self, auto_open_depth: impl Into<LogAutoOpenDepth>) {
unsafe { sys::igLogToClipboard(auto_open_depth.into().raw()) }
}
#[doc(alias = "LogButtons")]
pub fn log_buttons(&self) {
unsafe { sys::igLogButtons() }
}
#[doc(alias = "LogFinish")]
pub fn log_finish(&self) {
unsafe { sys::igLogFinish() }
}
}
#[cfg(test)]
mod tests {
#[test]
fn log_auto_open_depth_preserves_default_sentinel_and_rejects_overflow() {
assert_eq!(super::LogAutoOpenDepth::DEFAULT.raw(), -1);
assert_eq!(super::LogAutoOpenDepth::new(0).raw(), 0);
assert_eq!(super::LogAutoOpenDepth::new(3).raw(), 3);
assert!(
std::panic::catch_unwind(|| super::LogAutoOpenDepth::new(i32::MAX as u32 + 1)).is_err()
);
}
}