use std::str::FromStr;
use ontolius::TermId;
#[derive(Debug, PartialEq, Clone, serde::Serialize, serde::Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct PhenotypicFeature {
#[serde(
serialize_with = "TermId::serialize_as_curie",
deserialize_with = "TermId::deserialize_from_curie"
)]
pub identifier: TermId,
pub is_present: bool,
}
impl TryFrom<crate::io::generated::stratiphy_model::PhenotypicFeature> for PhenotypicFeature {
type Error = String;
fn try_from(
value: crate::io::generated::stratiphy_model::PhenotypicFeature,
) -> Result<Self, Self::Error> {
Ok(Self {
identifier: TermId::from_str(&value.identifier).map_err(|e| e.to_string())?,
is_present: !value.is_excluded,
})
}
}
#[derive(Debug, PartialEq, Clone, serde::Serialize, serde::Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct SampleLabels {
pub label: String,
pub meta_label: Option<String>,
}
impl From<crate::io::generated::stratiphy_model::SampleLabels> for SampleLabels {
fn from(value: crate::io::generated::stratiphy_model::SampleLabels) -> Self {
Self {
label: value.label,
meta_label: value.meta_label,
}
}
}
#[derive(Debug, PartialEq, Clone, serde::Serialize, serde::Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Sample {
pub labels: SampleLabels,
pub phenotypic_features: Vec<PhenotypicFeature>,
}
impl TryFrom<crate::io::generated::stratiphy_model::Sample> for Sample {
type Error = String;
fn try_from(value: crate::io::generated::stratiphy_model::Sample) -> Result<Self, Self::Error> {
let labels = if let Some(labels) = value.labels {
labels.into()
} else {
return Err("Missing labels".to_string());
};
let mut phenotypic_features = vec![];
for ele in value.phenotypic_features {
phenotypic_features.push(ele.try_into()?);
}
Ok(Self {
labels,
phenotypic_features,
})
}
}
#[derive(Debug, PartialEq, Clone, serde::Serialize, serde::Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Cohort {
pub members: Vec<Sample>,
}
impl TryFrom<crate::io::generated::stratiphy_model::Cohort> for Cohort {
type Error = String;
fn try_from(value: crate::io::generated::stratiphy_model::Cohort) -> Result<Self, Self::Error> {
let mut members = vec![];
for ele in value.members {
members.push(ele.try_into()?);
}
Ok(Self { members })
}
}