treeherder-cli 0.2.9

Fetch errors from a Firefox CI push on Treeherder, formatted as markdown
use crate::models::*;
use anyhow::Result;
use serde::Serialize;

#[derive(Serialize)]
pub struct JsonOutput {
    pub revision: String,
    pub push_id: u64,
    pub jobs: Vec<JobWithLogs>,
}

#[derive(Serialize)]
pub struct GroupedJsonOutput {
    pub revision: String,
    pub push_id: u64,
    pub grouped_failures: Vec<GroupedTestFailure>,
}

pub fn format_json_output(revision: &str, push_id: u64, jobs: &[JobWithLogs]) -> Result<String> {
    let output = JsonOutput {
        revision: revision.to_string(),
        push_id,
        jobs: jobs.to_vec(),
    };
    Ok(serde_json::to_string_pretty(&output)?)
}

pub fn format_grouped_json_output(
    revision: &str,
    push_id: u64,
    grouped: &[GroupedTestFailure],
) -> Result<String> {
    let output = GroupedJsonOutput {
        revision: revision.to_string(),
        push_id,
        grouped_failures: grouped.to_vec(),
    };
    Ok(serde_json::to_string_pretty(&output)?)
}

pub fn format_comparison_json(result: &ComparisonResult) -> Result<String> {
    Ok(serde_json::to_string_pretty(result)?)
}

pub fn format_perf_json(revision: &str, push_id: u64, perf_data: &[JobPerfData]) -> Result<String> {
    let output = serde_json::json!({
        "revision": revision,
        "push_id": push_id,
        "jobs": perf_data,
    });
    Ok(serde_json::to_string_pretty(&output)?)
}

pub fn format_similar_history_json(history: &SimilarJobHistory) -> Result<String> {
    Ok(serde_json::to_string_pretty(history)?)
}