class Template(BaseModel):
model_config: ClassVar[ConfigDict] = ConfigDict(extra="forbid", frozen=True)
name: BBox
mr_id: BBox | None = None
diagnoses: BBox
allergy_history: BBox | None = None
department: BBox
rx_id: BBox
age: BBox
drugs: list[DrugTemplate]
preconception_pregnancy_lactation: BBox | None = None
hepatic_impairment: BBox | None = None
renal_impairment: BBox | None = None
insurance_id: BBox | None = None
follow_up_notes: BBox | None = None
remarks: BBox | None = None
date_year: BBox
date_month: BBox
date_day: BBox
hospital: BBox
sex: BBox | None = None
sex_male: BBox | None = None
sex_female: BBox | None = None
weight: BBox | None = None
def non_drug_bboxes(self) -> list[NamedBBox]:
return [
NamedBBox(name=k, bbox=v)
for k, v in self.model_dump(mode="python").items()
if k != "drugs" and v is not None
]
The current approach I come up with is
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Template {
name: BBox,
mr_id: Option<BBox>,
diagnoses: BBox,
allergy_history: Option<BBox>,
department: BBox,
rx_id: BBox,
age: BBox,
drugs: Vec<DrugTemplate>,
preconception_pregnancy_lactation: Option<BBox>,
hepatic_impairment: Option<BBox>,
renal_impairment: Option<BBox>,
insurance_id: Option<BBox>,
follow_up_notes: Option<BBox>,
remarks: Option<BBox>,
date_year: BBox,
date_month: BBox,
date_day: BBox,
hospital: BBox,
sex: Option<BBox>,
sex_male: Option<BBox>,
sex_female: Option<BBox>,
weight: Option<BBox>,
}
impl Template {
pub fn non_drug_bboxes(&self) -> Vec<NamedBBox> {
[
("name", Some(self.name)),
("mr_id", self.mr_id),
("diagnoses", Some(self.diagnoses)),
("allergy_history", self.allergy_history),
("department", Some(self.department)),
("rx_id", Some(self.rx_id)),
("age", Some(self.age)),
(
"preconception_pregnancy_lactation",
self.preconception_pregnancy_lactation,
),
("hepatic_impairment", self.hepatic_impairment),
("renal_impairment", self.renal_impairment),
("insurance_id", self.insurance_id),
("follow_up_notes", self.follow_up_notes),
("remarks", self.remarks),
("date_year", Some(self.date_year)),
("date_month", Some(self.date_month)),
("date_day", Some(self.date_day)),
("hospital", Some(self.hospital)),
("sex", self.sex),
("sex_male", self.sex_male),
("sex_female", self.sex_female),
("weight", self.weight),
]
.into_iter()
.filter_map(|(name, bbox)| {
if let Some(bbox) = bbox {
Some(NamedBBox {
name: name.to_string(),
bbox,
})
} else {
None
}
})
.collect()
}
}
I wonder if there is a way to simplify the non_drug_bboxes
method. Thanks!