coveralls 0.1.5

Send job to Coveralls (coveralls.io)
Documentation
use super::git::GitInfos;
use serde::{Deserialize, Serialize};
use std::io::{Cursor, Read, Result};

#[derive(Debug, Serialize, Deserialize)]
pub(crate) struct SourceFile {
    pub(crate) name: String,
    pub(crate) source_digest: String,
    pub(crate) coverage: Vec<Option<usize>>,

    #[serde(skip_serializing_if = "Vec::<usize>::is_empty")]
    #[serde(default)]
    pub(crate) branches: Vec<usize>,

    #[serde(skip_serializing_if = "Option::is_none")]
    #[serde(default)]
    pub(crate) source: Option<String>,
}

#[derive(Serialize, Deserialize)]
pub struct Coverage {
    #[serde(default)]
    pub(crate) repo_token: String,

    #[serde(default)]
    pub(crate) service_name: String,

    #[serde(skip_serializing_if = "String::is_empty")]
    #[serde(default)]
    pub(crate) service_number: String,

    #[serde(skip_serializing_if = "String::is_empty")]
    #[serde(default)]
    pub(crate) service_job_id: String,

    #[serde(skip_serializing_if = "String::is_empty")]
    #[serde(default)]
    pub(crate) service_pull_request: String,

    #[serde(skip_serializing_if = "Option::is_none")]
    #[serde(default)]
    pub(crate) flag_name: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    #[serde(default)]
    pub(crate) git: Option<GitInfos>,

    #[serde(skip_serializing_if = "String::is_empty")]
    #[serde(default)]
    pub(crate) run_at: String,

    #[serde(default)]
    pub(crate) source_files: Vec<SourceFile>,
}

impl Coverage {
    pub fn from_reader<R: Read>(rdr: R) -> Result<Self> {
        Ok(serde_json::from_reader(rdr)?)
    }

    pub fn new_reader(&self) -> Result<Box<dyn Read>> {
        Ok(Box::new(Cursor::new(serde_json::to_string(&self)?)))
    }

    pub fn git(&self) -> Option<&GitInfos> {
        self.git.as_ref()
    }
}