fluidattacks-core 0.19.0

Fluid Attacks Core Library
Documentation
fn env(key: &str) -> Option<String> {
    std::env::var(key).ok()
}

pub fn is_batch() -> bool {
    env("AWS_BATCH_JOB_ID").is_some()
}

fn get_environment() -> String {
    env("PRODUCT_ENVIRONMENT").unwrap_or_else(|| {
        if env("CI_COMMIT_REF_NAME").as_deref() == Some("trunk") {
            "production".to_owned()
        } else {
            "development".to_owned()
        }
    })
}

fn get_version() -> String {
    env("PRODUCT_VERSION")
        .or_else(|| {
            let sha = env("CI_COMMIT_SHA")?;
            let end = sha.len().min(8);
            sha.get(..end).map(ToOwned::to_owned)
        })
        .unwrap_or_else(|| "00000000".to_owned())
}

fn resolve_service(fallback: &str) -> String {
    env("PRODUCT_ID")
        .or_else(|| env("JOB_DEFINITION_NAME"))
        .or_else(|| env("JOB_NAME"))
        .or_else(|| env("AWS_BATCH_JQ_NAME").map(|q| format!("from-{q}")))
        .unwrap_or_else(|| fallback.to_owned())
}

fn unknown() -> String {
    "unknown".to_owned()
}

pub fn batch_source_fields(fallback: &str) -> Vec<(&'static str, String)> {
    vec![
        ("ddsource", "batch".to_owned()),
        ("dd.service", resolve_service(fallback)),
        ("dd.version", get_version()),
        ("deployment.environment", get_environment()),
        (
            "job_metadata.id",
            env("AWS_BATCH_JOB_ID").unwrap_or_else(unknown),
        ),
        (
            "job_metadata.queue",
            env("AWS_BATCH_JQ_NAME").unwrap_or_else(unknown),
        ),
        (
            "job_metadata.definition_name",
            env("JOB_DEFINITION_NAME").unwrap_or_else(unknown),
        ),
        (
            "job_metadata.attempt",
            env("AWS_BATCH_JOB_ATTEMPT").unwrap_or_else(unknown),
        ),
        (
            "job_metadata.compute_environment",
            env("AWS_BATCH_CE_NAME").unwrap_or_else(unknown),
        ),
    ]
}

pub fn default_source_fields(fallback: &str) -> Vec<(&'static str, String)> {
    vec![
        ("ddsource", "rust".to_owned()),
        (
            "dd.service",
            env("PRODUCT_ID").unwrap_or_else(|| fallback.to_owned()),
        ),
        ("dd.version", get_version()),
        ("deployment.environment", get_environment()),
    ]
}

pub fn source_fields(product_id_fallback: &str) -> Vec<(&'static str, String)> {
    if is_batch() {
        batch_source_fields(product_id_fallback)
    } else {
        default_source_fields(product_id_fallback)
    }
}