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
use anyhow::{anyhow, Result};
use regex::Regex;
use serde::{Deserialize, Serialize};

use crate::constants;

#[allow(non_snake_case)]
#[derive(Deserialize, Serialize, Builder, Default, Clone)]
#[builder(default)]
pub struct BackendTask {
    pub BuildNo: String,
    pub PR: u64,
    pub RepoName: String,
    pub Member: String,
}

fn get_value_by_field(f: &str, s: &str) -> Option<String> {
    let re = Regex::new(&format!(r"{f}:\s*(?P<v>.+?)((\r?\n)|$)")).unwrap();
    if let Some(m) = re.captures(s) {
        m.name("v").map(|s| s.as_str().trim().to_owned())
    } else {
        None
    }
}

pub fn get_backend_task_from_str(
    s: &str,
    repo: String,
    pr_number: u64,
    member: String,
) -> Result<BackendTask> {
    let mut t = BackendTaskBuilder::default();
    if let Some(v) = get_value_by_field("BN", s) {
        t.BuildNo(v);
    } else {
        return Err(anyhow!(format!(
            "{img}\r\n Build number is required.\r\n Please read the {doc}",
            img = constants::FAIL_IMAGE_URL,
            doc = constants::DOC_URL
        )));
    }
    t.RepoName(repo);
    t.PR(pr_number);
    t.Member(member);
    Ok(t.build().unwrap())
}

#[cfg(test)]
mod test {
    #[test]
    fn test_get_value() {
        use super::*;
        let s = r#"BN: 7.3.3.4.9064.0015
        evanl00"#;
        let v = get_value_by_field("BN", s);
        assert_eq!(v.unwrap(), "7.3.3.4.9064.0015");

        let s = "BN: 7.3.3.4.9064.0015\r\n";
        let v = get_value_by_field("BN", s);
        assert_eq!(v.unwrap(), "7.3.3.4.9064.0015");
    }
    #[test]
    fn test_get_backend_task() {
        use super::get_backend_task_from_str;
        let s = r#"BN: 7.3.3.4.9064.0015
        "#;
        let t = get_backend_task_from_str(s, "ro".to_string(), 121, "mt".to_owned());
        assert_eq!(t.unwrap().BuildNo, "7.3.3.4.9064.0015");
        let s = r#"BN: 7.3.3.4.9064.0015"#;
        let t = get_backend_task_from_str(s, "ro".to_string(), 121, "mt".to_owned());
        assert_eq!(t.unwrap().BuildNo, "7.3.3.4.9064.0015");
    }
    #[test]
    fn test_get_backend_task_no_task() {
        use super::*;
        let s = r#"BNE: 7.3.3.4.9064.0015
        "#;
        let t = get_backend_task_from_str(s, "ro".to_string(), 121, "mt".to_owned());
        assert_eq!(true, t.is_err());
    }
}