Files
zack3d f439894864 feat(organs): add detailed physiology + coupling
- Implement rich state machines and hemodynamic/metabolic models across
  organs (brain, heart, lungs, kidneys, liver, stomach, intestines,
  pancreas, gallbladder, spleen, spinal cord, bladder, esophagus)
- Add new enums for organ phases/states (e.g., SleepStage,
  VentilatoryState, CardiacRhythmState, RenalAutoregulationState,
  GastricPhase, etc.)
- Extend organ structs with explicit physiology fields; rewrite update()
  loops and summaries to reflect realistic dynamics
- Wire inter-organ signaling in Patient (oxygenation, CPP, autonomic,
  hormones, bile, bile acids, urine→bladder, gastric emptying→intestines)
  using a relax_value smoothing helper
- Minor formatting in build.rs

BREAKING CHANGE: public organ structs gained/renamed fields and updated
summaries; code using struct literals or prior field names will break.
Use constructors (e.g., new()) and updated fields; summary outputs have
changed.
2025-09-24 01:34:34 -07:00

53 lines
1.6 KiB
Rust

use std::env;
use std::fs;
use std::path::PathBuf;
fn main() {
if env::var_os("CARGO_FEATURE_FFI").is_none() {
return;
}
println!("cargo:rerun-if-changed=src/ffi.rs");
println!("cargo:rerun-if-changed=cbindgen.toml");
let crate_dir =
PathBuf::from(env::var("CARGO_MANIFEST_DIR").expect("CARGO_MANIFEST_DIR not set"));
let crate_dir_string = crate_dir
.to_str()
.expect("crate directory must be valid UTF-8")
.to_owned();
let header_dir = crate_dir.join("ffi");
fs::create_dir_all(&header_dir).expect("failed to create ffi output directory");
let config_path = crate_dir.join("cbindgen.toml");
let config = if config_path.exists() {
cbindgen::Config::from_file(&config_path)
.unwrap_or_else(|err| panic!("failed to load cbindgen config: {err}"))
} else {
cbindgen::Config::default()
};
let bindings = cbindgen::Builder::new()
.with_config(config)
.with_crate(crate_dir_string)
.generate()
.expect("unable to generate cbindgen bindings");
let mut generated = Vec::new();
bindings.write(&mut generated);
let header_contents =
String::from_utf8(generated).expect("generated header was not valid UTF-8");
let header_path = header_dir.join("medicallib.h");
let needs_write = fs::read_to_string(&header_path)
.map(|existing| existing != header_contents)
.unwrap_or(true);
if needs_write {
fs::write(&header_path, header_contents).expect("failed to write medicallib.h");
println!("cargo:warning=Updated ffi/medicallib.h via cbindgen");
}
}