use std::env;
use std::fmt;
use std::io::{self, Write};
use std::sync::OnceLock;
static DEBUG_ENABLED: OnceLock<bool> = OnceLock::new();
static WARNING_ENABLED: OnceLock<bool> = OnceLock::new();
static INFO_ENABLED: OnceLock<bool> = OnceLock::new();
pub fn debug_enabled() -> bool {
*DEBUG_ENABLED.get_or_init(|| env::var_os("SPGLIB_DEBUG").is_some())
}
pub fn warning_enabled() -> bool {
*WARNING_ENABLED.get_or_init(|| {
match env::var("SPGLIB_WARNING") {
Ok(val) => val != "OFF",
Err(_) => true, }
})
}
pub fn info_enabled() -> bool {
*INFO_ENABLED.get_or_init(|| env::var_os("SPGLIB_INFO").is_some())
}
pub fn debug_print_matrix_d3(a: &[[f64; 3]; 3]) {
if !debug_enabled() {
return;
}
let stdout = io::stdout();
let mut handle = stdout.lock();
for row in a {
let _ = writeln!(handle, "{:.6} {:.6} {:.6}", row[0], row[1], row[2]);
}
}
pub fn debug_print_matrix_i3(a: &[[i32; 3]; 3]) {
if !debug_enabled() {
return;
}
let stdout = io::stdout();
let mut handle = stdout.lock();
for row in a {
let _ = writeln!(handle, "{} {} {}", row[0], row[1], row[2]);
}
}
pub fn debug_print_vectors_d3(a: &[[f64; 3]]) {
if !debug_enabled() {
return;
}
let stdout = io::stdout();
let mut handle = stdout.lock();
for (i, vec) in a.iter().enumerate() {
let _ = writeln!(handle, "{}: {:.6} {:.6} {:.6}", i + 1, vec[0], vec[1], vec[2]);
}
}
pub fn debug_print_vector_d3(a: &[f64; 3]) {
if !debug_enabled() {
return;
}
let stdout = io::stdout();
let mut handle = stdout.lock();
let _ = writeln!(handle, "{:.6} {:.6} {:.6}", a[0], a[1], a[2]);
}
pub fn debug_print_vectors_with_label(a: &[[f64; 3]], b: &[i32]) {
if !debug_enabled() {
return;
}
let stdout = io::stdout();
let mut handle = stdout.lock();
for (i, vec) in a.iter().enumerate() {
let label = if i < b.len() { b[i] } else { 0 };
let _ = writeln!(handle, "{}: {:.6} {:.6} {:.6}", label, vec[0], vec[1], vec[2]);
}
}
pub fn debug_print(args: fmt::Arguments) {
if !debug_enabled() {
return;
}
let _ = io::stdout().write_fmt(args);
}
pub fn warning_print(args: fmt::Arguments) {
if !warning_enabled() {
return;
}
let _ = io::stderr().write_fmt(args);
}
pub fn info_print(args: fmt::Arguments) {
if !info_enabled() {
return;
}
let _ = io::stderr().write_fmt(args);
}
pub fn warning_memory(what: &str) {
warning_print(format_args!(
"Spglib: Memory could not be allocated: {}\n",
what
));
}
#[cfg(test)]
mod tests {
use super::*;
use std::sync::Mutex;
static ENV_LOCK: Mutex<()> = Mutex::new(());
#[test]
fn test_print_functions_no_panic() {
let mat_d = [[1.0, 0.0, 0.0], [0.0, 1.0, 0.0], [0.0, 0.0, 1.0]];
let mat_i = [[1, 0, 0], [0, 1, 0], [0, 0, 1]];
let vec_d = [1.0, 2.0, 3.0];
let vecs_d = vec![[1.0, 0.0, 0.0], [0.0, 1.0, 0.0]];
let labels = vec![1, 2];
debug_print_matrix_d3(&mat_d);
debug_print_matrix_i3(&mat_i);
debug_print_vector_d3(&vec_d);
debug_print_vectors_d3(&vecs_d);
debug_print_vectors_with_label(&vecs_d, &labels);
debug_print(format_args!("Test debug print: {}\n", 123));
}
}