dear-imgui-rs 0.14.0

High-level Rust bindings to Dear ImGui v1.92.7 with docking, WGPU/GL backends, and extensions (ImPlot/ImPlot3D, ImNodes, ImGuizmo, file browser, reflection-based UI)
Documentation
pub(crate) fn assert_finite_f32(caller: &str, name: &str, value: f32) {
    assert!(value.is_finite(), "{caller} {name} must be finite");
}

pub(crate) fn assert_finite_vec2(caller: &str, name: &str, value: [f32; 2]) {
    assert!(
        value[0].is_finite() && value[1].is_finite(),
        "{caller} {name} must contain finite values"
    );
}

pub(crate) fn assert_non_negative_f32(caller: &str, name: &str, value: f32) {
    assert_finite_f32(caller, name, value);
    assert!(value >= 0.0, "{caller} {name} must be non-negative");
}

pub(crate) fn assert_positive_f32(caller: &str, name: &str, value: f32) {
    assert_finite_f32(caller, name, value);
    assert!(value > 0.0, "{caller} {name} must be positive");
}

pub(crate) fn assert_display_size(caller: &str, size: [f32; 2]) {
    assert_finite_vec2(caller, "size", size);
    assert!(
        size[0] >= 0.0 && size[1] >= 0.0,
        "{caller} size must contain non-negative values"
    );
}

pub(crate) fn assert_display_framebuffer_scale(caller: &str, scale: [f32; 2]) {
    assert_finite_vec2(caller, "scale", scale);
    assert!(
        scale[0] >= 0.0 && scale[1] >= 0.0,
        "{caller} scale must contain non-negative values"
    );
}

pub(crate) fn assert_memory_compact_timer(caller: &str, seconds: f32) {
    assert_finite_f32(caller, "seconds", seconds);
    assert!(
        seconds >= 0.0 || seconds == -1.0,
        "{caller} seconds must be non-negative, or -1.0 to disable"
    );
}

pub(crate) fn metric_count_from_i32(caller: &str, raw: i32) -> usize {
    usize::try_from(raw).unwrap_or_else(|_| panic!("{caller} returned a negative count"))
}