use std::fs::File;
use std::io::prelude::*;
use serde_json::Value;
use std::collections::HashMap;
#[derive(Debug, PartialEq, Eq, Hash, Clone, Copy)]
pub enum SurgeryStep {
Preparation,
CarlotTriangleDissection,
ClippingAndCutting,
GallbladderDissection,
GallbladderPackaging,
CleaningAndCoagulation,
GallbladderExtraction,
}
impl From<u8> for SurgeryStep {
fn from(step: u8) -> Self {
match step {
0 => SurgeryStep::Preparation,
1 => SurgeryStep::CarlotTriangleDissection,
2 => SurgeryStep::ClippingAndCutting,
3 => SurgeryStep::GallbladderDissection,
4 => SurgeryStep::GallbladderPackaging,
5 => SurgeryStep::CleaningAndCoagulation,
6 => SurgeryStep::GallbladderExtraction,
_ => panic!("Invalid step"),
}
}
}
impl SurgeryStep {
pub fn to_u8(&self) -> u8 {
match self {
SurgeryStep::Preparation => 0,
SurgeryStep::CarlotTriangleDissection => 1,
SurgeryStep::ClippingAndCutting => 2,
SurgeryStep::GallbladderDissection => 3,
SurgeryStep::GallbladderPackaging => 4,
SurgeryStep::CleaningAndCoagulation => 5,
SurgeryStep::GallbladderExtraction => 6,
}
}
pub fn to_binary_string(&self) -> String {
format!("{:08b}", self.to_u8())
}
}
pub fn read_tags(path: &str) -> Result<String, std::io::Error> {
let mut file = File::open(path)?;
let mut contents = String::new();
file.read_to_string(&mut contents)?;
return Ok(contents)
}
pub fn parse_surgery_steps(data: String) -> HashMap<String, Vec<SurgeryStep>> {
let v: Value = serde_json::from_str(&data).expect("Invalid JSON");
let mut map = HashMap::new();
for (key, steps) in v.as_object().expect("Expected a JSON object") {
let steps_list = steps.as_array().expect("Expected an array")
.iter()
.map(|step| SurgeryStep::from(step.as_u64().expect("Expected an integer") as u8))
.collect();
map.insert(key.to_string(), steps_list);
}
map
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_read_tags() {
let tags = read_tags("./data_stash/cleaned_labels/VID68_processed.json").unwrap();
let data = parse_surgery_steps(tags);
assert_eq!(SurgeryStep::ClippingAndCutting, data.get("968").unwrap()[0]);
}
#[test]
fn test_surgery_step_to_binary_string() {
let step = SurgeryStep::GallbladderPackaging;
assert_eq!("00000100", step.to_binary_string());
}
}