1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121
use colored::*; use reqwest::IntoUrl; use serde::{Deserialize, Serialize}; use std::convert::From; use crate::step::Step; use reqwest; #[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] pub struct StepResult { pub name: String, pub description: Option<String>, pub pass: bool, pub output: String, pub error: Option<String>, pub duration: f32, } #[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] pub struct WebHook { hostname: String, has_errors: bool, tests: Vec<StepResult>, } pub async fn submit_webhook<U: IntoUrl, I: Into<String>>( results: &Vec<StepResult>, url: U, hostname: I, ) -> Result<(), reqwest::Error> { let has_errors = results.iter().any(|result| result.pass == false); let payload = WebHook { hostname: hostname.into(), has_errors: has_errors, tests: results.clone(), }; let client = reqwest::Client::new(); let builder = client.post(url); let builder = builder.json(&payload); builder.send().await?; Ok(()) } impl StepResult { pub fn terminal_print(&self, colours: &bool) { let mut message = format!("- name: {}\n", self.name); if let Some(ref description) = self.description { message.push_str(&format!(" description: {}\n", description)) } message.push_str(&format!(" pass: {}\n", self.pass)); if self.output != "" { if self.output.contains("\n") { message.push_str(&format!( " output: |\n {}\n", self.output.replace("\n", "\n ") )); } else { message.push_str(&format!(" output: {}\n", self.output)); } } if let Some(ref error) = self.error { message.push_str(&format!(" error: {}\n", error)); } message.push_str(&format!(" duration: {}ms\n", self.duration)); if *colours { match self.pass { true => { println!("{}", message.green().bold()); } false => { println!("{}", message.red().bold()); } } } else { println!("{}", message); } } } impl From<Step> for StepResult { fn from(step: Step) -> Self { let duration = step.get_duration_ms(); let name = step.name; let description = step.description; let (pass, output, error) = match step.outcome { Some(outcome) => { let output = match step.do_output { true => outcome.output.unwrap_or_default(), false => String::new(), }; (outcome.error.is_none(), output, outcome.error) } None => (false, String::new(), Some(String::from("Not finished"))), }; StepResult { name, duration, description, pass, output, error, } } }