jencli 0.1.0

A tool to work with Jenkins from the command line.
Documentation
extern crate failure;
extern crate regex;

extern crate jenkins_api;

use regex::Regex;

#[derive(Clone)]
pub struct JenkinsInformation {
    pub url: String,
    pub user: Option<String>,
    pub password: Option<String>,
    pub depth: u8,
}

fn build_jenkins_client(
    jenkins_info: &JenkinsInformation,
) -> Result<jenkins_api::Jenkins, failure::Error> {
    let mut jenkins_builder = jenkins_api::JenkinsBuilder::new(&jenkins_info.url);
    jenkins_builder = match (&jenkins_info.user, &jenkins_info.password) {
        (Some(ref user), None) => jenkins_builder.with_user(user, None),
        (Some(ref user), Some(ref password)) => jenkins_builder.with_user(user, Some(password)),
        (_, _) => jenkins_builder,
    };
    Ok(jenkins_builder.with_depth(jenkins_info.depth).build()?)
}

pub fn search_job(
    jenkins_info: &JenkinsInformation,
    pattern: &str,
) -> Result<impl Iterator<Item = jenkins_api::job::ShortJob>, failure::Error> {
    let jenkins = build_jenkins_client(jenkins_info)?;

    let re = Regex::new(pattern).unwrap();

    Ok(jenkins
        .get_home()?
        .jobs
        .into_iter()
        .filter(move |job| re.is_match(&job.name)))
}

pub fn get_job(
    jenkins_info: &JenkinsInformation,
    name: &str,
) -> Result<jenkins_api::job::CommonJob, failure::Error> {
    let jenkins = build_jenkins_client(jenkins_info)?;

    Ok(jenkins.get_job(name)?)
}

pub fn get_build(
    jenkins_info: &JenkinsInformation,
    name: &str,
    number: Option<u32>,
) -> Result<jenkins_api::build::CommonBuild, failure::Error> {
    let jenkins = build_jenkins_client(jenkins_info)?;

    match number {
        Some(n) => Ok(jenkins.get_build(name, n)?),
        None => Ok(jenkins.get_build(name, "lastBuild")?),
    }
}

pub fn list_views(
    jenkins_info: &JenkinsInformation,
    pattern: Option<String>,
) -> Result<impl Iterator<Item = jenkins_api::view::ShortView>, failure::Error> {
    let jenkins = build_jenkins_client(jenkins_info)?;

    let views = jenkins.get_home()?.views.into_iter();

    match pattern {
        Some(pattern) => {
            let re = Regex::new(&pattern).unwrap();
            Ok(views
                .filter(move |view| re.is_match(&view.name))
                .collect::<Vec<jenkins_api::view::ShortView>>()
                .into_iter())
        }
        None => Ok(views),
    }
}

pub fn list_jobs_of_view(
    jenkins_info: &JenkinsInformation,
    name: &str,
) -> Result<impl Iterator<Item = jenkins_api::job::ShortJob>, failure::Error> {
    let jenkins = build_jenkins_client(jenkins_info)?;

    Ok(jenkins.get_view(name)?.jobs.into_iter())
}

pub fn trigger_job(
    jenkins_info: &JenkinsInformation,
    name: &str,
) -> Result<jenkins_api::queue::ShortQueueItem, failure::Error> {
    let jenkins = build_jenkins_client(jenkins_info)?;

    Ok(jenkins.build_job(name)?)
}

pub fn get_queue_item(
    jenkins_info: &JenkinsInformation,
    queue_item: &jenkins_api::queue::ShortQueueItem,
) -> Result<jenkins_api::queue::QueueItem, failure::Error> {
    let jenkins = build_jenkins_client(jenkins_info)?;

    Ok(queue_item.get_full_queue_item(&jenkins)?)
}