diff --git a/rust/bioscript-cli/src/report_observations.rs b/rust/bioscript-cli/src/report_observations.rs index eb11db3..323237d 100644 --- a/rust/bioscript-cli/src/report_observations.rs +++ b/rust/bioscript-cli/src/report_observations.rs @@ -17,11 +17,22 @@ fn app_observation_from_manifest_row( &manifest_path.display().to_string(), )?; let manifest = task.manifest; - let (gene, observed_alt_alleles, source) = if row_path.contains('#') { - (String::new(), Vec::new(), serde_json::Value::Null) + let (gene, alt_alleles, observed_alt_alleles, source) = if row_path.contains('#') { + ( + String::new(), + manifest + .spec + .alternate + .clone() + .into_iter() + .collect::>(), + manifest.spec.observed_alternates.clone(), + serde_json::Value::Null, + ) } else { ( variant_manifest_gene(&manifest_path)?, + variant_alt_alleles(&manifest_path)?, variant_observed_alt_alleles(&manifest_path)?, variant_primary_source(&manifest_path)?, ) @@ -34,6 +45,7 @@ fn app_observation_from_manifest_row( manifest, gene, source, + alt_alleles, observed_alt_alleles, inferred_sex, fallback_assembly, @@ -117,3 +129,24 @@ fn variant_observed_alt_alleles(path: &Path) -> Result, String> { .map(ToOwned::to_owned) .collect()) } + +fn variant_alt_alleles(path: &Path) -> Result, String> { + let text = fs::read_to_string(path) + .map_err(|err| format!("failed to read variant YAML {}: {err}", path.display()))?; + let value: serde_yaml::Value = serde_yaml::from_str(&text) + .map_err(|err| format!("failed to parse variant YAML {}: {err}", path.display()))?; + let Some(items) = value + .as_mapping() + .and_then(|mapping| mapping.get(serde_yaml::Value::String("alleles".to_owned()))) + .and_then(serde_yaml::Value::as_mapping) + .and_then(|mapping| mapping.get(serde_yaml::Value::String("alts".to_owned()))) + .and_then(serde_yaml::Value::as_sequence) + else { + return Ok(Vec::new()); + }; + Ok(items + .iter() + .filter_map(serde_yaml::Value::as_str) + .map(ToOwned::to_owned) + .collect()) +} diff --git a/rust/bioscript-wasm/src/report_helpers.rs b/rust/bioscript-wasm/src/report_helpers.rs index c088cf7..dde614a 100644 --- a/rust/bioscript-wasm/src/report_helpers.rs +++ b/rust/bioscript-wasm/src/report_helpers.rs @@ -124,6 +124,23 @@ pub(super) fn variant_observed_alt_alleles_from_yaml(value: &serde_yaml::Value) .unwrap_or_default() } +pub(super) fn variant_alt_alleles_from_yaml(value: &serde_yaml::Value) -> Vec { + value + .as_mapping() + .and_then(|mapping| mapping.get(serde_yaml::Value::String("alleles".to_owned()))) + .and_then(serde_yaml::Value::as_mapping) + .and_then(|mapping| mapping.get(serde_yaml::Value::String("alts".to_owned()))) + .and_then(serde_yaml::Value::as_sequence) + .map(|items| { + items + .iter() + .filter_map(serde_yaml::Value::as_str) + .map(ToOwned::to_owned) + .collect() + }) + .unwrap_or_default() +} + #[cfg(test)] mod tests { use super::participant_id_from_name; diff --git a/rust/bioscript-wasm/src/report_workspace.rs b/rust/bioscript-wasm/src/report_workspace.rs index c5cde93..d48db90 100644 --- a/rust/bioscript-wasm/src/report_workspace.rs +++ b/rust/bioscript-wasm/src/report_workspace.rs @@ -68,13 +68,22 @@ impl bioscript_reporting::ReportWorkspace for PackageWorkspace { fallback_assembly: Option, ) -> Result { let row_path = row.get("path").cloned().unwrap_or_default(); - let (manifest, gene, source, observed_alt_alleles) = if row_path.contains('#') { + let (manifest, gene, source, alt_alleles, observed_alt_alleles) = if row_path.contains('#') { let task = bioscript_reporting::load_variant_manifest_task_by_path(self, &row_path)?; + let alt_alleles = task + .manifest + .spec + .alternate + .clone() + .into_iter() + .collect::>(); + let observed_alt_alleles = task.manifest.spec.observed_alternates.clone(); ( task.manifest, String::new(), serde_json::Value::Null, - Vec::new(), + alt_alleles, + observed_alt_alleles, ) } else { let manifest = self @@ -85,6 +94,7 @@ impl bioscript_reporting::ReportWorkspace for PackageWorkspace { manifest, yaml_string(&value, "gene").unwrap_or_default(), variant_primary_source_from_yaml(&value), + variant_alt_alleles_from_yaml(&value), variant_observed_alt_alleles_from_yaml(&value), ) }; @@ -96,6 +106,7 @@ impl bioscript_reporting::ReportWorkspace for PackageWorkspace { manifest, gene, source, + alt_alleles, observed_alt_alleles, inferred_sex, fallback_assembly,