oxihuman_morph/
jaundice_morph.rs1#![allow(dead_code)]
4
5#[derive(Debug, Clone, Copy, PartialEq)]
9pub enum JaundiceSeverity {
10 Mild,
11 Moderate,
12 Severe,
13}
14
15#[derive(Debug, Clone)]
17pub struct JaundiceMorph {
18 pub severity: JaundiceSeverity,
19 pub bilirubin_level: f32,
20 pub intensity: f32,
21 pub morph_count: usize,
22 pub enabled: bool,
23}
24
25impl JaundiceMorph {
26 pub fn new(morph_count: usize) -> Self {
27 JaundiceMorph {
28 severity: JaundiceSeverity::Mild,
29 bilirubin_level: 0.0,
30 intensity: 0.0,
31 morph_count,
32 enabled: true,
33 }
34 }
35}
36
37pub fn new_jaundice_morph(morph_count: usize) -> JaundiceMorph {
39 JaundiceMorph::new(morph_count)
40}
41
42pub fn jdm_set_severity(morph: &mut JaundiceMorph, severity: JaundiceSeverity) {
44 morph.severity = severity;
45}
46
47pub fn jdm_set_bilirubin(morph: &mut JaundiceMorph, bilirubin: f32) {
49 morph.bilirubin_level = bilirubin.max(0.0);
50}
51
52pub fn jdm_set_intensity(morph: &mut JaundiceMorph, intensity: f32) {
54 morph.intensity = intensity.clamp(0.0, 1.0);
55}
56
57pub fn jdm_evaluate(morph: &JaundiceMorph) -> Vec<f32> {
59 if !morph.enabled || morph.morph_count == 0 {
61 return vec![];
62 }
63 vec![morph.intensity; morph.morph_count]
64}
65
66pub fn jdm_set_enabled(morph: &mut JaundiceMorph, enabled: bool) {
68 morph.enabled = enabled;
69}
70
71pub fn jdm_to_json(morph: &JaundiceMorph) -> String {
73 let sev = match morph.severity {
74 JaundiceSeverity::Mild => "mild",
75 JaundiceSeverity::Moderate => "moderate",
76 JaundiceSeverity::Severe => "severe",
77 };
78 format!(
79 r#"{{"severity":"{}","bilirubin_level":{},"intensity":{},"morph_count":{},"enabled":{}}}"#,
80 sev, morph.bilirubin_level, morph.intensity, morph.morph_count, morph.enabled
81 )
82}
83
84#[cfg(test)]
85mod tests {
86 use super::*;
87
88 #[test]
89 fn test_default_severity() {
90 let m = new_jaundice_morph(4);
91 assert_eq!(
92 m.severity,
93 JaundiceSeverity::Mild );
95 }
96
97 #[test]
98 fn test_set_severity() {
99 let mut m = new_jaundice_morph(4);
100 jdm_set_severity(&mut m, JaundiceSeverity::Severe);
101 assert_eq!(
102 m.severity,
103 JaundiceSeverity::Severe );
105 }
106
107 #[test]
108 fn test_bilirubin_clamp() {
109 let mut m = new_jaundice_morph(4);
110 jdm_set_bilirubin(&mut m, -5.0);
111 assert!(m.bilirubin_level.abs() < 1e-6 );
112 }
113
114 #[test]
115 fn test_intensity_clamp() {
116 let mut m = new_jaundice_morph(4);
117 jdm_set_intensity(&mut m, 2.0);
118 assert!((m.intensity - 1.0).abs() < 1e-6 );
119 }
120
121 #[test]
122 fn test_evaluate_length() {
123 let mut m = new_jaundice_morph(6);
124 jdm_set_intensity(&mut m, 0.5);
125 assert_eq!(
126 jdm_evaluate(&m).len(),
127 6 );
129 }
130
131 #[test]
132 fn test_evaluate_disabled() {
133 let mut m = new_jaundice_morph(4);
134 jdm_set_enabled(&mut m, false);
135 assert!(jdm_evaluate(&m).is_empty() );
136 }
137
138 #[test]
139 fn test_to_json_has_severity() {
140 let m = new_jaundice_morph(4);
141 let j = jdm_to_json(&m);
142 assert!(j.contains("\"severity\"") );
143 }
144
145 #[test]
146 fn test_enabled_default() {
147 let m = new_jaundice_morph(4);
148 assert!(m.enabled );
149 }
150
151 #[test]
152 fn test_evaluate_matches_intensity() {
153 let mut m = new_jaundice_morph(3);
154 jdm_set_intensity(&mut m, 0.3);
155 let out = jdm_evaluate(&m);
156 assert!((out[0] - 0.3).abs() < 1e-5 );
157 }
158}