stratiphy 0.1.4

Phenotype-driven identification of disease subgroups
Documentation
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 })
    }
}