use serde_json::{Map, Value};
use uuid::Uuid;
use crate::config::OpenLineageConfig;
use crate::facets::{BaseFacet, ParentJob, ParentRun, ParentRunFacet};
#[derive(Debug, Default, Clone)]
pub struct LineageContext {
pub run_id: Option<Uuid>,
pub job_namespace: Option<String>,
pub job_name: Option<String>,
pub parent_run: Option<ParentRunFacet>,
pub run_facets: Map<String, Value>,
pub job_facets: Map<String, Value>,
pub sql: Option<String>,
}
impl LineageContext {
pub fn from_env(config: &OpenLineageConfig) -> Self {
let parent_run = parent_from_env(config);
LineageContext {
parent_run,
..Default::default()
}
}
}
fn parent_from_env(config: &OpenLineageConfig) -> Option<ParentRunFacet> {
let (namespace, name, run_id) = if let Ok(parent_id) = std::env::var("OPENLINEAGE_PARENT_ID") {
let parts: Vec<&str> = parent_id.splitn(3, '/').collect();
match parts.as_slice() {
[ns, n, rid] => (ns.to_string(), n.to_string(), rid.to_string()),
_ => return None,
}
} else {
let ns = std::env::var("OPENLINEAGE_PARENT_JOB_NAMESPACE").ok()?;
let n = std::env::var("OPENLINEAGE_PARENT_JOB_NAME").ok()?;
let rid = std::env::var("OPENLINEAGE_PARENT_RUN_ID").ok()?;
(ns, n, rid)
};
Some(ParentRunFacet {
base: BaseFacet::new(&config.producer, "1-1-0/ParentRunFacet.json"),
run: ParentRun { run_id },
job: ParentJob { namespace, name },
root: None,
})
}