From 00b269ffcfcbacd2c32fbdfe98e916f5260c8349 Mon Sep 17 00:00:00 2001 From: softprops Date: Sun, 3 Jan 2016 17:31:43 -0500 Subject: impl container filter --- examples/containers.rs | 9 +++++++-- src/builder.rs | 24 ++++++++++++++++++++++++ src/lib.rs | 2 ++ src/transport.rs | 1 + 4 files changed, 34 insertions(+), 2 deletions(-) diff --git a/examples/containers.rs b/examples/containers.rs index e7987e6..e4df6b3 100644 --- a/examples/containers.rs +++ b/examples/containers.rs @@ -1,10 +1,15 @@ extern crate shiplift; -use shiplift::Docker; +use shiplift::{ContainerFilter, Docker}; fn main() { let docker = Docker::new(); - for c in docker.containers().list().sized().build().unwrap() { + for c in docker.containers(). + list() + .sized() + .filter(vec![ + ContainerFilter::Label("foo".to_owned(), "bar".to_owned()) + ]).build().unwrap() { println!("container -> {:?}", c) } } diff --git a/src/builder.rs b/src/builder.rs index 87b79d5..de83b6a 100644 --- a/src/builder.rs +++ b/src/builder.rs @@ -18,6 +18,13 @@ pub struct ContainerListBuilder<'a> { params: HashMap<&'static str, String>, } +pub enum ContainerFilter { + ExitCode(u64), + Status(String), + LabelName(String), + Label(String, String) +} + impl<'a> ContainerListBuilder<'a> { pub fn new(docker: &'a Docker) -> ContainerListBuilder<'a> { ContainerListBuilder { @@ -26,6 +33,23 @@ impl<'a> ContainerListBuilder<'a> { } } + pub fn filter(&mut self, filters: Vec) -> &mut ContainerListBuilder<'a> { + let mut param = HashMap::new(); + for f in filters { + match f { + ContainerFilter::ExitCode(c) => param.insert("exit", vec![c.to_string()]), + ContainerFilter::Status(s) => param.insert("status", vec![s]), + ContainerFilter::LabelName(n) => param.insert("label", vec![n]), + ContainerFilter::Label(n,v) => param.insert("label", vec![format!("{}={}", n, v)]) + }; + + } + // structure is a a json encoded object mapping string keys to a list + // of string values + self.params.insert("filters", json::encode(¶m).unwrap()); + self + } + pub fn all(&mut self) -> &mut ContainerListBuilder<'a> { self.params.insert("all", "true".to_owned()); self diff --git a/src/lib.rs b/src/lib.rs index 116bb7e..95743bb 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -26,6 +26,8 @@ pub mod transport; pub mod errors; pub use errors::Error; +pub use builder::ContainerFilter; + use builder::{ContainerBuilder, ContainerListBuilder, EventsBuilder}; use hyper::{Client, Url}; use hyper::net::{HttpsConnector, Openssl}; diff --git a/src/transport.rs b/src/transport.rs index e82f5c8..f22027e 100644 --- a/src/transport.rs +++ b/src/transport.rs @@ -81,6 +81,7 @@ impl Transport { Ok(Box::new(res)) } StatusCode::NoContent => Ok(Box::new(BufReader::new("".as_bytes()))), + // todo: constantize these StatusCode::BadRequest => Err(Error::Fault { code: res.status, message: "bad parameter".to_owned() }), StatusCode::NotFound => Err(Error::Fault { code: res.status, message: "not found".to_owned() }), StatusCode::NotAcceptable => Err(Error::Fault { code: res.status, message: "not acceptable".to_owned() }), -- cgit v1.2.3