From 7859295cea87bb1bd12969066b99137185382314 Mon Sep 17 00:00:00 2001 From: softprops Date: Mon, 8 Oct 2018 19:13:48 -0400 Subject: try to get a consistent and repeatable codestyle going --- .travis.yml | 6 + examples/containers.rs | 2 +- examples/logs.rs | 4 +- examples/networkcreate.rs | 8 +- examples/networks.rs | 2 +- rustfmt.toml | 12 +- src/builder.rs | 397 ++++++++++++++++++++++++++++++---------------- src/errors.rs | 5 +- src/lib.rs | 197 ++++++++++++++--------- src/rep.rs | 11 +- src/tarball.rs | 27 ++-- src/transport.rs | 25 ++- src/tty.rs | 8 +- 13 files changed, 445 insertions(+), 259 deletions(-) diff --git a/.travis.yml b/.travis.yml index e48d782..6d8c363 100644 --- a/.travis.yml +++ b/.travis.yml @@ -11,7 +11,13 @@ matrix: allow_failures: - rust: nightly +install: | + # should only be nessessary until rustfmt produces consistent results in stable/nightly + rustup toolchain install nightly + rustup component add rustfmt-preview --toolchain nightly + script: +- cargo +nightly fmt --all -- --check - RUSTFLAGS="$RUSTFLAGS -C link-dead-code" cargo test cache: diff --git a/examples/containers.rs b/examples/containers.rs index 427fbe9..27a5d20 100644 --- a/examples/containers.rs +++ b/examples/containers.rs @@ -1,5 +1,5 @@ -extern crate shiplift; extern crate env_logger; +extern crate shiplift; use shiplift::Docker; diff --git a/examples/logs.rs b/examples/logs.rs index e4fba98..18e68d0 100644 --- a/examples/logs.rs +++ b/examples/logs.rs @@ -9,9 +9,7 @@ fn main() { let mut logs = docker .containers() .get(&id) - .logs(&LogsOptions::builder() - .stdout(true) - .build()) + .logs(&LogsOptions::builder().stdout(true).build()) .unwrap(); std::io::copy(&mut logs, &mut std::io::stdout()).unwrap(); } diff --git a/examples/networkcreate.rs b/examples/networkcreate.rs index 8afce82..e64d826 100644 --- a/examples/networkcreate.rs +++ b/examples/networkcreate.rs @@ -8,9 +8,11 @@ fn main() { let networks = docker.networks(); if let Some(network_name) = env::args().nth(1) { let info = networks - .create(&NetworkCreateOptions::builder(network_name.as_ref()) - .driver("bridge") - .build()) + .create( + &NetworkCreateOptions::builder(network_name.as_ref()) + .driver("bridge") + .build(), + ) .unwrap(); println!("{:?}", info); } diff --git a/examples/networks.rs b/examples/networks.rs index 7e8393e..03da617 100644 --- a/examples/networks.rs +++ b/examples/networks.rs @@ -1,5 +1,5 @@ -extern crate shiplift; extern crate env_logger; +extern crate shiplift; use shiplift::Docker; diff --git a/rustfmt.toml b/rustfmt.toml index d83987d..ecbc0a6 100644 --- a/rustfmt.toml +++ b/rustfmt.toml @@ -1,10 +1,2 @@ -# keep imports tidy -reorder_imported_names = true -reorder_imports = true -reorder_imports_in_group = true -# there is no try! -use_try_shorthand = true -# don't create rustfmt artifacts -write_mode = "Replace" -# reduce wide load -max_width = 80 \ No newline at end of file +# style function arg lists consistently +fn_args_density = "Vertical" \ No newline at end of file diff --git a/src/builder.rs b/src/builder.rs index 0171a3e..031090e 100644 --- a/src/builder.rs +++ b/src/builder.rs @@ -1,15 +1,15 @@ //! Interfaces for building various structures use self::super::Result; +use errors::Error; use serde::Serialize; -use serde_json::{self, Value, Number, map::Map}; +use serde_json::{self, map::Map, Number, Value}; use std::cmp::Eq; use std::collections::{BTreeMap, HashMap}; use std::hash::Hash; use std::iter::IntoIterator; use std::iter::Peekable; use url::form_urlencoded; -use errors::Error; #[derive(Default)] pub struct PullOptions { @@ -27,8 +27,11 @@ impl PullOptions { if self.params.is_empty() { None } else { - Some(form_urlencoded::Serializer::new(String::new()) - .extend_pairs(&self.params).finish()) + Some( + form_urlencoded::Serializer::new(String::new()) + .extend_pairs(&self.params) + .finish(), + ) } } } @@ -40,10 +43,15 @@ pub struct PullOptionsBuilder { impl PullOptionsBuilder { pub fn new() -> PullOptionsBuilder { - PullOptionsBuilder { ..Default::default() } + PullOptionsBuilder { + ..Default::default() + } } - pub fn image(&mut self, img: I) -> &mut PullOptionsBuilder + pub fn image( + &mut self, + img: I, + ) -> &mut PullOptionsBuilder where I: Into, { @@ -51,7 +59,10 @@ impl PullOptionsBuilder { self } - pub fn src(&mut self, s: S) -> &mut PullOptionsBuilder + pub fn src( + &mut self, + s: S, + ) -> &mut PullOptionsBuilder where S: Into, { @@ -59,7 +70,10 @@ impl PullOptionsBuilder { self } - pub fn repo(&mut self, r: R) -> &mut PullOptionsBuilder + pub fn repo( + &mut self, + r: R, + ) -> &mut PullOptionsBuilder where R: Into, { @@ -67,7 +81,10 @@ impl PullOptionsBuilder { self } - pub fn tag(&mut self, t: T) -> &mut PullOptionsBuilder + pub fn tag( + &mut self, + t: T, + ) -> &mut PullOptionsBuilder where T: Into, { @@ -76,7 +93,9 @@ impl PullOptionsBuilder { } pub fn build(&self) -> PullOptions { - PullOptions { params: self.params.clone() } + PullOptions { + params: self.params.clone(), + } } } @@ -102,8 +121,11 @@ impl BuildOptions { if self.params.is_empty() { None } else { - Some(form_urlencoded::Serializer::new(String::new()) - .extend_pairs(&self.params).finish()) + Some( + form_urlencoded::Serializer::new(String::new()) + .extend_pairs(&self.params) + .finish(), + ) } } } @@ -128,7 +150,10 @@ impl BuildOptionsBuilder { } /// set the name of the docker file. defaults to "DockerFile" - pub fn dockerfile

(&mut self, path: P) -> &mut BuildOptionsBuilder + pub fn dockerfile

( + &mut self, + path: P, + ) -> &mut BuildOptionsBuilder where P: Into, { @@ -137,7 +162,10 @@ impl BuildOptionsBuilder { } /// tag this image with a name after building it - pub fn tag(&mut self, t: T) -> &mut BuildOptionsBuilder + pub fn tag( + &mut self, + t: T, + ) -> &mut BuildOptionsBuilder where T: Into, { @@ -145,7 +173,10 @@ impl BuildOptionsBuilder { self } - pub fn remote(&mut self, r: R) -> &mut BuildOptionsBuilder + pub fn remote( + &mut self, + r: R, + ) -> &mut BuildOptionsBuilder where R: Into, { @@ -154,25 +185,37 @@ impl BuildOptionsBuilder { } /// don't use the image cache when building image - pub fn nocache(&mut self, nc: bool) -> &mut BuildOptionsBuilder { + pub fn nocache( + &mut self, + nc: bool, + ) -> &mut BuildOptionsBuilder { self.params.insert("nocache", nc.to_string()); self } - pub fn rm(&mut self, r: bool) -> &mut BuildOptionsBuilder { + pub fn rm( + &mut self, + r: bool, + ) -> &mut BuildOptionsBuilder { self.params.insert("rm", r.to_string()); self } - pub fn forcerm(&mut self, fr: bool) -> &mut BuildOptionsBuilder { + pub fn forcerm( + &mut self, + fr: bool, + ) -> &mut BuildOptionsBuilder { self.params.insert("forcerm", fr.to_string()); self } /// `bridge`, `host`, `none`, `container:`, or a custom network name. - pub fn network_mode(&mut self, t: T) -> &mut BuildOptionsBuilder - where - T: Into, + pub fn network_mode( + &mut self, + t: T, + ) -> &mut BuildOptionsBuilder + where + T: Into, { self.params.insert("networkmode", t.into()); self @@ -211,8 +254,11 @@ impl ContainerListOptions { if self.params.is_empty() { None } else { - Some(form_urlencoded::Serializer::new(String::new()) - .extend_pairs(&self.params).finish()) + Some( + form_urlencoded::Serializer::new(String::new()) + .extend_pairs(&self.params) + .finish(), + ) } } } @@ -233,7 +279,9 @@ pub struct ContainerListOptionsBuilder { impl ContainerListOptionsBuilder { pub fn new() -> ContainerListOptionsBuilder { - ContainerListOptionsBuilder { ..Default::default() } + ContainerListOptionsBuilder { + ..Default::default() + } } pub fn filter( @@ -243,20 +291,16 @@ impl ContainerListOptionsBuilder { let mut param = HashMap::new(); for f in filters { match f { - ContainerFilter::ExitCode(c) => { - param.insert("exit", vec![c.to_string()]) - } + 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)]) - } + 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", serde_json::to_string(¶m).unwrap()); + self.params + .insert("filters", serde_json::to_string(¶m).unwrap()); self } @@ -265,12 +309,18 @@ impl ContainerListOptionsBuilder { self } - pub fn since(&mut self, since: &str) -> &mut ContainerListOptionsBuilder { + pub fn since( + &mut self, + since: &str, + ) -> &mut ContainerListOptionsBuilder { self.params.insert("since", since.to_owned()); self } - pub fn before(&mut self, before: &str) -> &mut ContainerListOptionsBuilder { + pub fn before( + &mut self, + before: &str, + ) -> &mut ContainerListOptionsBuilder { self.params.insert("before", before.to_owned()); self } @@ -281,7 +331,9 @@ impl ContainerListOptionsBuilder { } pub fn build(&self) -> ContainerListOptions { - ContainerListOptions { params: self.params.clone() } + ContainerListOptions { + params: self.params.clone(), + } } } @@ -315,10 +367,10 @@ fn insert<'a, I, V>( insert(key_path, value, node); } else { - parent_node.as_object_mut().unwrap().insert( - local_key.to_string(), - serde_json::to_value(value).unwrap(), - ); + parent_node + .as_object_mut() + .unwrap() + .insert(local_key.to_string(), serde_json::to_value(value).unwrap()); } } @@ -337,10 +389,7 @@ impl ContainerOptions { let mut body_members = Map::new(); // The HostConfig element gets initialized to an empty object, // for backward compatibility. - body_members.insert( - "HostConfig".to_string(), - Value::Object(Map::new()), - ); + body_members.insert("HostConfig".to_string(), Value::Object(Map::new())); let mut body = Value::Object(body_members); self.parse_from(&self.params, &mut body); self.parse_from(&self.params_list, &mut body); @@ -387,7 +436,10 @@ impl ContainerOptionsBuilder { } } - pub fn name(&mut self, name: &str) -> &mut ContainerOptionsBuilder { + pub fn name( + &mut self, + name: &str, + ) -> &mut ContainerOptionsBuilder { self.name = Some(name.to_owned()); self } @@ -405,7 +457,10 @@ impl ContainerOptionsBuilder { self } - pub fn links(&mut self, links: Vec<&str>) -> &mut ContainerOptionsBuilder { + pub fn links( + &mut self, + links: Vec<&str>, + ) -> &mut ContainerOptionsBuilder { for link in links { self.params_list .entry("HostConfig.Links") @@ -415,24 +470,27 @@ impl ContainerOptionsBuilder { self } - pub fn memory(&mut self, memory: u64) -> &mut ContainerOptionsBuilder { - self.params.insert("HostConfig.Memory", Value::Number(Number::from(memory))); + pub fn memory( + &mut self, + memory: u64, + ) -> &mut ContainerOptionsBuilder { + self.params + .insert("HostConfig.Memory", Value::Number(Number::from(memory))); self } - pub fn labels(&mut self, labels: &HashMap<&str, &str>) -> &mut ContainerOptionsBuilder { - + pub fn labels( + &mut self, + labels: &HashMap<&str, &str>, + ) -> &mut ContainerOptionsBuilder { let mut json_labels = Map::new(); for (k, v) in labels { - let key : &str = k.as_ref(); - let value : &str = v.as_ref(); - json_labels.insert(key .to_owned(), Value::String(value.to_string())); + let key: &str = k.as_ref(); + let value: &str = v.as_ref(); + json_labels.insert(key.to_owned(), Value::String(value.to_string())); } - self.params.insert( - "Labels", - Value::Object(json_labels), - ); + self.params.insert("Labels", Value::Object(json_labels)); self } @@ -469,28 +527,34 @@ impl ContainerOptionsBuilder { network: &str, ) -> &mut ContainerOptionsBuilder { if !network.is_empty() { - self.params.insert( - "HostConfig.NetworkMode", - Value::String(network.to_owned()), - ); + self.params + .insert("HostConfig.NetworkMode", Value::String(network.to_owned())); } self } - pub fn env(&mut self, envs: Vec<&str>) -> &mut ContainerOptionsBuilder { + pub fn env( + &mut self, + envs: Vec<&str>, + ) -> &mut ContainerOptionsBuilder { for env in envs { - self.params_list.entry("Env").or_insert(Vec::new()).push( - env.to_owned(), - ); + self.params_list + .entry("Env") + .or_insert(Vec::new()) + .push(env.to_owned()); } self } - pub fn cmd(&mut self, cmds: Vec<&str>) -> &mut ContainerOptionsBuilder { + pub fn cmd( + &mut self, + cmds: Vec<&str>, + ) -> &mut ContainerOptionsBuilder { for cmd in cmds { - self.params_list.entry("Cmd").or_insert(Vec::new()).push( - cmd.to_owned(), - ); + self.params_list + .entry("Cmd") + .or_insert(Vec::new()) + .push(cmd.to_owned()); } self } @@ -500,10 +564,8 @@ impl ContainerOptionsBuilder { entrypoint: &str, ) -> &mut ContainerOptionsBuilder { if !entrypoint.is_empty() { - self.params.insert( - "Entrypoint", - Value::String(entrypoint.to_owned()), - ); + self.params + .insert("Entrypoint", Value::String(entrypoint.to_owned())); } self } @@ -610,21 +672,29 @@ impl ExecContainerOptionsBuilder { } /// Command to run, as an array of strings - pub fn cmd(&mut self, cmds: Vec<&str>) -> &mut ExecContainerOptionsBuilder { + pub fn cmd( + &mut self, + cmds: Vec<&str>, + ) -> &mut ExecContainerOptionsBuilder { for cmd in cmds { - self.params.entry("Cmd").or_insert(Vec::new()).push( - cmd.to_owned(), - ); + self.params + .entry("Cmd") + .or_insert(Vec::new()) + .push(cmd.to_owned()); } self } /// A list of environment variables in the form "VAR=value" - pub fn env(&mut self, envs: Vec<&str>) -> &mut ExecContainerOptionsBuilder { + pub fn env( + &mut self, + envs: Vec<&str>, + ) -> &mut ExecContainerOptionsBuilder { for env in envs { - self.params.entry("Env").or_insert(Vec::new()).push( - env.to_owned(), - ); + self.params + .entry("Env") + .or_insert(Vec::new()) + .push(env.to_owned()); } self } @@ -671,13 +741,15 @@ impl EventsOptions { if self.params.is_empty() { None } else { - Some(form_urlencoded::Serializer::new(String::new()) - .extend_pairs(&self.params).finish()) + Some( + form_urlencoded::Serializer::new(String::new()) + .extend_pairs(&self.params) + .finish(), + ) } } } - pub enum EventFilterType { Container, Image, @@ -724,17 +796,25 @@ pub struct EventsOptionsBuilder { impl EventsOptionsBuilder { pub fn new() -> EventsOptionsBuilder { - EventsOptionsBuilder { ..Default::default() } + EventsOptionsBuilder { + ..Default::default() + } } /// Filter events since a given timestamp - pub fn since(&mut self, ts: &u64) -> &mut EventsOptionsBuilder { + pub fn since( + &mut self, + ts: &u64, + ) -> &mut EventsOptionsBuilder { self.params.insert("since", ts.to_string()); self } /// Filter events until a given timestamp - pub fn until(&mut self, ts: &u64) -> &mut EventsOptionsBuilder { + pub fn until( + &mut self, + ts: &u64, + ) -> &mut EventsOptionsBuilder { self.params.insert("until", ts.to_string()); self } @@ -749,49 +829,50 @@ impl EventsOptionsBuilder { EventFilter::Container(n) => { self.containers.push(n); params.insert("container", self.containers.clone()) - }, + } EventFilter::Event(n) => { self.events.push(n); params.insert("event", self.events.clone()) - }, + } EventFilter::Image(n) => { self.images.push(n); params.insert("image", self.images.clone()) - }, + } EventFilter::Label(n) => { self.labels.push(n); params.insert("label", self.labels.clone()) - }, + } EventFilter::Volume(n) => { self.volumes.push(n); params.insert("volume", self.volumes.clone()) - }, + } EventFilter::Network(n) => { self.networks.push(n); params.insert("network", self.networks.clone()) - }, + } EventFilter::Daemon(n) => { self.daemons.push(n); params.insert("daemon", self.daemons.clone()) - }, + } EventFilter::Type(n) => { let event_type = event_filter_type_to_string(n).to_string(); self.types.push(event_type); params.insert("type", self.types.clone()) } }; - } - self.params.insert("filters", serde_json::to_string(¶ms).unwrap()); + self.params + .insert("filters", serde_json::to_string(¶ms).unwrap()); self } pub fn build(&self) -> EventsOptions { - EventsOptions { params: self.params.clone() } + EventsOptions { + params: self.params.clone(), + } } } - /// Options for controlling log request results #[derive(Default)] pub struct LogsOptions { @@ -809,8 +890,11 @@ impl LogsOptions { if self.params.is_empty() { None } else { - Some(form_urlencoded::Serializer::new(String::new()) - .extend_pairs(&self.params).finish()) + Some( + form_urlencoded::Serializer::new(String::new()) + .extend_pairs(&self.params) + .finish(), + ) } } } @@ -823,41 +907,59 @@ pub struct LogsOptionsBuilder { impl LogsOptionsBuilder { pub fn new() -> LogsOptionsBuilder { - LogsOptionsBuilder { ..Default::default() } + LogsOptionsBuilder { + ..Default::default() + } } - pub fn follow(&mut self, f: bool) -> &mut LogsOptionsBuilder { + pub fn follow( + &mut self, + f: bool, + ) -> &mut LogsOptionsBuilder { self.params.insert("follow", f.to_string()); self } - pub fn stdout(&mut self, s: bool) -> &mut LogsOptionsBuilder { + pub fn stdout( + &mut self, + s: bool, + ) -> &mut LogsOptionsBuilder { self.params.insert("stdout", s.to_string()); self } - pub fn stderr(&mut self, s: bool) -> &mut LogsOptionsBuilder { + pub fn stderr( + &mut self, + s: bool, + ) -> &mut LogsOptionsBuilder { self.params.insert("stderr", s.to_string()); self } - pub fn timestamps(&mut self, t: bool) -> &mut LogsOptionsBuilder { + pub fn timestamps( + &mut self, + t: bool, + ) -> &mut LogsOptionsBuilder { self.params.insert("timestamps", t.to_string()); self } /// how_many can either by "all" or a to_string() of the number - pub fn tail(&mut self, how_many: &str) -> &mut LogsOptionsBuilder { + pub fn tail( + &mut self, + how_many: &str, + ) -> &mut LogsOptionsBuilder { self.params.insert("tail", how_many.to_owned()); self } pub fn build(&self) -> LogsOptions { - LogsOptions { params: self.params.clone() } + LogsOptions { + params: self.params.clone(), + } } } - /// Filter options for image listings pub enum ImageFilter { Dangling, @@ -879,8 +981,11 @@ impl ImageListOptions { if self.params.is_empty() { None } else { - Some(form_urlencoded::Serializer::new(String::new()) - .extend_pairs(&self.params).finish()) + Some( + form_urlencoded::Serializer::new(String::new()) + .extend_pairs(&self.params) + .finish(), + ) } } } @@ -893,20 +998,31 @@ pub struct ImageListOptionsBuilder { impl ImageListOptionsBuilder { pub fn new() -> ImageListOptionsBuilder { - ImageListOptionsBuilder { ..Default::default() } + ImageListOptionsBuilder { + ..Default::default() + } } - pub fn digests(&mut self, d: bool) -> &mut ImageListOptionsBuilder { + pub fn digests( + &mut self, + d: bool, + ) -> &mut ImageListOptionsBuilder { self.params.insert("digests", d.to_string()); self } - pub fn all(&mut self, a: bool) -> &mut ImageListOptionsBuilder { + pub fn all( + &mut self, + a: bool, + ) -> &mut ImageListOptionsBuilder { self.params.insert("all", a.to_string()); self } - pub fn filter_name(&mut self, name: &str) -> &mut ImageListOptionsBuilder { + pub fn filter_name( + &mut self, + name: &str, + ) -> &mut ImageListOptionsBuilder { self.params.insert("filter", name.to_owned()); self } @@ -918,28 +1034,25 @@ impl ImageListOptionsBuilder { let mut param = HashMap::new(); for f in filters { match f { - ImageFilter::Dangling => { - param.insert("dangling", vec![true.to_string()]) - } + ImageFilter::Dangling => param.insert("dangling", vec![true.to_string()]), ImageFilter::LabelName(n) => param.insert("label", vec![n]), - ImageFilter::Label(n, v) => { - param.insert("label", vec![format!("{}={}", n, v)]) - } + ImageFilter::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", serde_json::to_string(¶m).unwrap()); + self.params + .insert("filters", serde_json::to_string(¶m).unwrap()); self } pub fn build(&self) -> ImageListOptions { - ImageListOptions { params: self.params.clone() } + ImageListOptions { + params: self.params.clone(), + } } } - /// Options for controlling log request results #[derive(Default)] pub struct RmContainerOptions { @@ -957,8 +1070,11 @@ impl RmContainerOptions { if self.params.is_empty() { None } else { - Some(form_urlencoded::Serializer::new(String::new()) - .extend_pairs(&self.params).finish()) + Some( + form_urlencoded::Serializer::new(String::new()) + .extend_pairs(&self.params) + .finish(), + ) } } } @@ -971,21 +1087,31 @@ pub struct RmContainerOptionsBuilder { impl RmContainerOptionsBuilder { pub fn new() -> RmContainerOptionsBuilder { - RmContainerOptionsBuilder { ..Default::default() } + RmContainerOptionsBuilder { + ..Default::default() + } } - pub fn force(&mut self, f: bool) -> &mut RmContainerOptionsBuilder { + pub fn force( + &mut self, + f: bool, + ) -> &mut RmContainerOptionsBuilder { self.params.insert("force", f.to_string()); self } - pub fn volumes(&mut self, s: bool) -> &mut RmContainerOptionsBuilder { + pub fn volumes( + &mut self, + s: bool, + ) -> &mut RmContainerOptionsBuilder { self.params.insert("v", s.to_string()); self } pub fn build(&self) -> RmContainerOptions { - RmContainerOptions { params: self.params.clone() } + RmContainerOptions { + params: self.params.clone(), + } } } @@ -1001,8 +1127,11 @@ impl NetworkListOptions { if self.params.is_empty() { None } else { - Some(form_urlencoded::Serializer::new(String::new()) - .extend_pairs(&self.params).finish()) + Some( + form_urlencoded::Serializer::new(String::new()) + .extend_pairs(&self.params) + .finish(), + ) } } } @@ -1064,7 +1193,10 @@ impl NetworkCreateOptionsBuilder { } } - pub fn driver(&mut self, name: &str) -> &mut NetworkCreateOptionsBuilder { + pub fn driver( + &mut self, + name: &str, + ) -> &mut NetworkCreateOptionsBuilder { if !name.is_empty() { self.params.insert("Driver", name.to_owned()); } @@ -1213,6 +1345,5 @@ mod tests { r#"{"HostConfig":{"RestartPolicy":{"Name":"always"}},"Image":"test_image"}"#, options.serialize().unwrap() ); - } } diff --git a/src/errors.rs b/src/errors.rs index 44be52a..b351309 100644 --- a/src/errors.rs +++ b/src/errors.rs @@ -41,7 +41,10 @@ impl From for Error { } impl fmt::Display for Error { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + fn fmt( + &self, + f: &mut fmt::Formatter, + ) -> fmt::Result { write!(f, "Docker Error: ")?; match self { &Error::SerdeJsonError(ref err) => return err.fmt(f), diff --git a/src/lib.rs b/src/lib.rs index ef8a8f7..01e1f0d 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -41,10 +41,9 @@ pub mod tty; mod tarball; pub use builder::{ - BuildOptions, ContainerConnectionOptions, ContainerFilter, - ContainerListOptions, ContainerOptions, EventsOptions, - ExecContainerOptions, ImageFilter, ImageListOptions, LogsOptions, - NetworkCreateOptions, NetworkListOptions, PullOptions, RmContainerOptions, + BuildOptions, ContainerConnectionOptions, ContainerFilter, ContainerListOptions, + ContainerOptions, EventsOptions, ExecContainerOptions, ImageFilter, ImageListOptions, + LogsOptions, NetworkCreateOptions, NetworkListOptions, PullOptions, RmContainerOptions, }; pub use errors::Error; use hyper::client::HttpConnector; @@ -57,9 +56,8 @@ use mime::Mime; use openssl::ssl::{SslConnector, SslFiletype, SslMethod}; use rep::Image as ImageRep; use rep::{ - Change, Container as ContainerRep, ContainerCreateInfo, ContainerDetails, - Event, Exit, History, ImageDetails, Info, SearchResult, Stats, Status, Top, - Version, + Change, Container as ContainerRep, ContainerCreateInfo, ContainerDetails, Event, Exit, History, + ImageDetails, Info, SearchResult, Stats, Status, Top, Version, }; use rep::{NetworkCreateInfo, NetworkDetails as NetworkInfo}; use serde_json::Value; @@ -89,7 +87,10 @@ pub struct Image<'a, 'b> { impl<'a, 'b> Image<'a, 'b> { /// Exports an interface for operations that may be performed against a named image - pub fn new(docker: &'a Docker, name: S) -> Image<'a, 'b> + pub fn new( + docker: &'a Docker, + name: S, + ) -> Image<'a, 'b> where S: Into>, { @@ -128,16 +129,19 @@ impl<'a, 'b> Image<'a, 'b> { .expect("expected Untagged to be a string") .to_owned(), ) - }).or(obj.get("Deleted").map(|sha| { + }) + .or(obj.get("Deleted").map(|sha| { Status::Deleted( sha.as_str() .expect("expected Deleted to be a string") .to_owned(), ) - })).expect("expected Untagged or Deleted") + })) + .expect("expected Untagged or Deleted") }), _ => unreachable!(), - }.collect()) + } + .collect()) } /// Export this image to a tarball @@ -172,16 +176,16 @@ impl<'a> Images<'a> { tarball::dir(&mut bytes, &opts.path[..])?; - self - .docker + self.docker .stream_post(&path.join("?"), Some((Body::from(bytes), tar()))) - .and_then(|r| { - serde_json::from_reader::<_, Vec>(r).map_err(Error::from) - }) + .and_then(|r| serde_json::from_reader::<_, Vec>(r).map_err(Error::from)) } /// Lists the docker images on the current docker host - pub fn list(&self, opts: &ImageListOptions) -> Result> { + pub fn list( + &self, + opts: &ImageListOptions, + ) -> Result> { let mut path = vec!["/images/json".to_owned()]; if let Some(query) = opts.serialize() { path.push(query); @@ -191,12 +195,18 @@ impl<'a> Images<'a> { } /// Returns a reference to a set of operations available for a named image - pub fn get(&'a self, name: &'a str) -> Image { + pub fn get( + &'a self, + name: &'a str, + ) -> Image { Image::new(self.docker, name) } /// Search for docker images by term - pub fn search(&self, term: &str) -> Result> { + pub fn search( + &self, + term: &str, + ) -> Result> { let query = form_urlencoded::Serializer::new(String::new()) .append_pair("term", term) .finish(); @@ -215,14 +225,15 @@ impl<'a> Images<'a> { } self.docker .stream_post::(&path.join("?"), None) - .and_then(|r| { - serde_json::from_reader::<_, Vec>(r).map_err(Error::from) - }) + .and_then(|r| serde_json::from_reader::<_, Vec>(r).map_err(Error::from)) } /// exports a collection of named images, /// either by name, name:tag, or image id, into a tarball - pub fn export(&self, names: Vec<&str>) -> Result> { + pub fn export( + &self, + names: Vec<&str>, + ) -> Result> { let params = names.iter().map(|n| ("names", *n)); let query = form_urlencoded::Serializer::new(String::new()) .extend_pairs(params) @@ -244,7 +255,10 @@ pub struct Container<'a, 'b> { impl<'a, 'b> Container<'a, 'b> { /// Exports an interface exposing operations against a container instance - pub fn new(docker: &'a Docker, id: S) -> Container<'a, 'b> + pub fn new( + docker: &'a Docker, + id: S, + ) -> Container<'a, 'b> where S: Into>, { @@ -268,7 +282,10 @@ impl<'a, 'b> Container<'a, 'b> { } /// Returns a `top` view of information about the container process - pub fn top(&self, psargs: Option<&str>) -> Result { + pub fn top( + &self, + psargs: Option<&str>, + ) -> Result { let mut path = vec![format!("/containers/{}/top", self.id)]; if let Some(ref args) = psargs { let encoded = form_urlencoded::Serializer::new(String::new()) @@ -282,7 +299,10 @@ impl<'a, 'b> Container<'a, 'b> { } /// Returns a stream of logs emitted but the container instance - pub fn logs(&self, opts: &LogsOptions) -> Result> { + pub fn logs( + &self, + opts: &LogsOptions, + ) -> Result> { let mut path = vec![format!("/containers/{}/logs", self.id)]; if let Some(query) = opts.serialize() { path.push(query) @@ -306,12 +326,9 @@ impl<'a, 'b> Container<'a, 'b> { /// Returns a stream of stats specific to this container instance pub fn stats(&self) -> Result> { - self - .docker + self.docker .stream_get(&format!("/containers/{}/stats", self.id)[..]) - .and_then(|r|{ - serde_json::from_reader::<_, Vec>(r).map_err(Error::from) - }) + .and_then(|r| serde_json::from_reader::<_, Vec>(r).map_err(Error::from)) } /// Start the container instance @@ -322,7 +339,10 @@ impl<'a, 'b> Container<'a, 'b> { } /// Stop the container instance - pub fn stop(&self, wait: Option) -> Result<()> { + pub fn stop( + &self, + wait: Option, + ) -> Result<()> { let mut path = vec![format!("/containers/{}/stop", self.id)]; if let Some(w) = wait { let encoded = form_urlencoded::Serializer::new(String::new()) @@ -335,7 +355,10 @@ impl<'a, 'b> Container<'a, 'b> { } /// Restart the container instance - pub fn restart(&self, wait: Option) -> Result<()> { + pub fn restart( + &self, + wait: Option, + ) -> Result<()> { let mut path = vec![format!("/containers/{}/restart", self.id)]; if let Some(w) = wait { let encoded = form_urlencoded::Serializer::new(String::new()) @@ -347,7 +370,10 @@ impl<'a, 'b> Container<'a, 'b> { } /// Kill the container instance - pub fn kill(&self, signal: Option<&str>) -> Result<()> { + pub fn kill( + &self, + signal: Option<&str>, + ) -> Result<()> { let mut path = vec![format!("/containers/{}/kill", self.id)]; if let Some(sig) = signal { let encoded = form_urlencoded::Serializer::new(String::new()) @@ -359,7 +385,10 @@ impl<'a, 'b> Container<'a, 'b> { } /// Rename the container instance - pub fn rename(&self, name: &str) -> Result<()> { + pub fn rename( + &self, + name: &str, + ) -> Result<()> { let query = form_urlencoded::Serializer::new(String::new()) .append_pair("name", name) .finish(); @@ -367,7 +396,8 @@ impl<'a, 'b> Container<'a, 'b> { .post::( &format!("/containers/{}/rename?{}", self.id, query)[..], None, - ).map(|_| ()) + ) + .map(|_| ()) } /// Pause the container instance @@ -402,7 +432,10 @@ impl<'a, 'b> Container<'a, 'b> { } /// Delete the container instance (todo: force/v) - pub fn remove(&self, opts: RmContainerOptions) -> Result<()> { + pub fn remove( + &self, + opts: RmContainerOptions, + ) -> Result<()> { let mut path = vec![format!("/containers/{}", self.id)]; if let Some(query) = opts.serialize() { path.push(query) @@ -412,7 +445,10 @@ impl<'a, 'b> Container<'a, 'b> { } /// Exec the specified command in the container - pub fn exec(&self, opts: &ExecContainerOptions) -> Result { + pub fn exec( + &self, + opts: &ExecContainerOptions, + ) -> Result { let data = opts.serialize()?; let bytes = data.into_bytes(); match self.docker.post( @@ -439,7 +475,7 @@ impl<'a, 'b> Container<'a, 'b> { Some((bytes, mime::APPLICATION_JSON)), ).map(|stream| Tty::new(stream)) } else { - // TODO + // TODO panic!() } } @@ -474,7 +510,10 @@ impl<'a> Containers<'a> { } /// Returns a reference to a set of operations available to a specific container instance - pub fn get(&'a self, name: &'a str) -> Container { + pub fn get( + &'a self, + name: &'a str, + ) -> Container { Container::new(self.docker, name) } @@ -514,7 +553,10 @@ impl<'a> Networks<'a> { } /// List the docker networks on the current docker host - pub fn list(&self, opts: &NetworkListOptions) -> Result> { + pub fn list( + &self, + opts: &NetworkListOptions, + ) -> Result> { let mut path = vec!["/networks".to_owned()]; if let Some(query) = opts.serialize() { path.push(query); @@ -524,7 +566,10 @@ impl<'a> Networks<'a> { } /// Returns a reference to a set of operations available to a specific network instance - pub fn get(&'a self, id: &'a str) -> Network { + pub fn get( + &'a self, + id: &'a str, + ) -> Network { Network::new(self.docker, id) } @@ -551,7 +596,10 @@ pub struct Network<'a, 'b> { impl<'a, 'b> Network<'a, 'b> { /// Exports an interface exposing operations against a network instance - pub fn new(docker: &'a Docker, id: S) -> Network<'a, 'b> + pub fn new( + docker: &'a Docker, + id: S, + ) -> Network<'a, 'b> where S: Into>, { @@ -580,12 +628,18 @@ impl<'a, 'b> Network<'a, 'b> { } /// Connect container to network - pub fn connect(&self, opts: &ContainerConnectionOptions) -> Result<()> { + pub fn connect( + &self, + opts: &ContainerConnectionOptions, + ) -> Result<()> { self.do_connection("connect", opts) } /// Disconnect container to network - pub fn disconnect(&self, opts: &ContainerConnectionOptions) -> Result<()> { + pub fn disconnect( + &self, + opts: &ContainerConnectionOptions, + ) -> Result<()> { self.do_connection("disconnect", opts) } @@ -601,7 +655,8 @@ impl<'a, 'b> Network<'a, 'b> { .post( &format!("/networks/{}/{}", self.id, segment)[..], Some((bytes, mime::APPLICATION_JSON)), - ).map(|_| ()) + ) + .map(|_| ()) } } @@ -631,9 +686,7 @@ impl Docker { { Docker { transport: Transport::Unix { - client: Client::builder() - .keep_alive(false) - .build(UnixConnector), + client: Client::builder().keep_alive(false).build(UnixConnector), runtime: RefCell::new(tokio::runtime::Runtime::new().unwrap()), path: socket_path.into(), }, @@ -654,9 +707,7 @@ impl Docker { Some("unix") => Docker { transport: Transport::Unix { client: Client::builder().build(UnixConnector), - runtime: RefCell::new( - tokio::runtime::Runtime::new().unwrap(), - ), + runtime: RefCell::new(tokio::runtime::Runtime::new().unwrap()), path: host.path().to_owned(), }, }, @@ -668,16 +719,13 @@ impl Docker { if let Some(ref certs) = env::var("DOCKER_CERT_PATH").ok() { // fixme: don't unwrap before you know what's in the box // https://github.com/hyperium/hyper/blob/master/src/net.rs#L427-L428 - let mut connector = - SslConnector::builder(SslMethod::tls()).unwrap(); + let mut connector = SslConnector::builder(SslMethod::tls()).unwrap(); connector.set_cipher_list("DEFAULT").unwrap(); let cert = &format!("{}/cert.pem", certs); let key = &format!("{}/key.pem", certs); connector - .set_certificate_file( - &Path::new(cert), - SslFiletype::PEM, - ).unwrap(); + .set_certificate_file(&Path::new(cert), SslFiletype::PEM) + .unwrap(); connector .set_private_key_file(&Path::new(key), SslFiletype::PEM) .unwrap(); @@ -687,16 +735,12 @@ impl Docker { } let http = HttpConnector::new(1); - let connector = - HttpsConnector::with_connector(http, connector) - .unwrap(); + let connector = HttpsConnector::with_connector(http, connector).unwrap(); Docker { transport: Transport::EncryptedTcp { client: Client::builder().build(connector), - runtime: RefCell::new( - tokio::runtime::Runtime::new().unwrap(), - ), + runtime: RefCell::new(tokio::runtime::Runtime::new().unwrap()), host: tcp_host_str, }, } @@ -704,9 +748,7 @@ impl Docker { Docker { transport: Transport::Tcp { client: Client::new(), - runtime: RefCell::new( - tokio::runtime::Runtime::new().unwrap(), - ), + runtime: RefCell::new(tokio::runtime::Runtime::new().unwrap()), host: tcp_host_str, }, } @@ -759,18 +801,28 @@ impl Docker { .and_then(|r| serde_json::from_reader::<_, Vec>(r).map_err(Error::from)) } - fn get(&self, endpoint: &str) -> Result { + fn get( + &self, + endpoint: &str, + ) -> Result { self.transport.request::(Method::GET, endpoint, None) } - fn post(&self, endpoint: &str, body: Option<(B, Mime)>) -> Result + fn post( + &self, + endpoint: &str, + body: Option<(B, Mime)>, + ) -> Result where B: Into, { self.transport.request(Method::POST, endpoint, body) } - fn delete(&self, endpoint: &str) -> Result { + fn delete( + &self, + endpoint: &str, + ) -> Result { self.transport .request::(Method::DELETE, endpoint, None) } @@ -786,7 +838,10 @@ impl Docker { self.transport.stream(Method::POST, endpoint, body) } - fn stream_get(&self, endpoint: &str) -> Result> { + fn stream_get( + &self, + endpoint: &str, + ) -> Result> { self.transport.stream::(Method::GET, endpoint, None) } } diff --git a/src/rep.rs b/src/rep.rs index 92cbe02..40e5975 100644 --- a/src/rep.rs +++ b/src/rep.rs @@ -115,8 +115,8 @@ pub struct NetworkSettings { #[serde(rename = "IPPrefixLen")] pub ip_prefix_len: u64, pub mac_address: String, /* pub PortMapping: Option, - * pub Ports: Option */ - pub networks: HashMap + * pub Ports: Option */ + pub networks: HashMap, } #[derive(Clone, Debug, Serialize, Deserialize)] @@ -156,9 +156,9 @@ pub struct HostConfig { pub privileged: bool, pub publish_all_ports: bool, pub readonly_rootfs: Option, /* pub RestartPolicy: ??? - * pub SecurityOpt: Option, - * pub Ulimits: Option - * pub VolumesFrom: Option */ + * pub SecurityOpt: Option, + * pub Ulimits: Option + * pub VolumesFrom: Option */ } #[derive(Clone, Debug, Serialize, Deserialize)] @@ -368,7 +368,6 @@ pub struct Change { pub path: String, } - #[derive(Clone, Debug, Serialize, Deserialize)] #[serde(rename_all = "PascalCase")] pub struct Top { diff --git a/src/tarball.rs b/src/tarball.rs index e2a358f..d414620 100644 --- a/src/tarball.rs +++ b/src/tarball.rs @@ -1,17 +1,24 @@ -use flate2::Compression; use flate2::write::GzEncoder; +use flate2::Compression; use std::fs::{self, File}; use std::io::{self, Write}; -use std::path::{MAIN_SEPARATOR, Path}; +use std::path::{Path, MAIN_SEPARATOR}; use tar::Builder; // todo: this is pretty involved. (re)factor this into its own crate -pub fn dir(buf: W, path: &str) -> io::Result<()> +pub fn dir( + buf: W, + path: &str, +) -> io::Result<()> where W: Write, { let mut archive = Builder::new(GzEncoder::new(buf, Compression::best())); - fn bundle(dir: &Path, f: &mut F, bundle_dir: bool) -> io::Result<()> + fn bundle( + dir: &Path, + f: &mut F, + bundle_dir: bool, + ) -> io::Result<()> where F: FnMut(&Path) -> io::Result<()>, { @@ -44,16 +51,14 @@ where let mut append = |path: &Path| { let canonical = path.canonicalize()?; // todo: don't unwrap - let relativized = canonical.to_str().unwrap().trim_left_matches( - &base_path_str[..], - ); + let relativized = canonical + .to_str() + .unwrap() + .trim_left_matches(&base_path_str[..]); if path.is_dir() { archive.append_dir(Path::new(relativized), &canonical)? } else { - archive.append_file( - Path::new(relativized), - &mut File::open(&canonical)?, - )? + archive.append_file(Path::new(relativized), &mut File::open(&canonical)?)? } Ok(()) }; diff --git a/src/transport.rs b/src/transport.rs index 0b52b60..d8c1ea1 100644 --- a/src/transport.rs +++ b/src/transport.rs @@ -52,12 +52,13 @@ pub enum Transport { } impl fmt::Debug for Transport { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + fn fmt( + &self, + f: &mut fmt::Formatter, + ) -> fmt::Result { match *self { Transport::Tcp { ref host, .. } => write!(f, "Tcp({})", host), - Transport::EncryptedTcp { ref host, .. } => { - write!(f, "EncryptedTcp({})", host) - } + Transport::EncryptedTcp { ref host, .. } => write!(f, "EncryptedTcp({})", host), #[cfg(feature = "unix-socket")] Transport::Unix { ref path, .. } => write!(f, "Unix({})", path), } @@ -128,18 +129,13 @@ impl Transport { let res = self.send_request(req)?; match res.status() { - StatusCode::OK - | StatusCode::CREATED - | StatusCode::SWITCHING_PROTOCOLS => { - let chunk = - self.runtime().block_on(res.into_body().concat2())?; + StatusCode::OK | StatusCode::CREATED | StatusCode::SWITCHING_PROTOCOLS => { + let chunk = self.runtime().block_on(res.into_body().concat2())?; Ok(Box::new(Cursor::new( chunk.into_iter().collect::>(), ))) } - StatusCode::NO_CONTENT => { - Ok(Box::new(BufReader::new("".as_bytes()))) - } + StatusCode::NO_CONTENT => Ok(Box::new(BufReader::new("".as_bytes()))), // todo: constantize these StatusCode::BAD_REQUEST => Err(Error::Fault { code: res.status(), @@ -206,7 +202,10 @@ impl Transport { /// Extract the error message content from an HTTP response that /// contains a Docker JSON error structure. - fn get_error_message(&self, res: Response) -> Option { + fn get_error_message( + &self, + res: Response, + ) -> Option { let chunk = match self.runtime().block_on(res.into_body().concat2()) { Ok(c) => c, Err(..) => return None, diff --git a/src/tty.rs b/src/tty.rs index 34ba93f..903a507 100644 --- a/src/tty.rs +++ b/src/tty.rs @@ -1,4 +1,3 @@ - use byteorder::{BigEndian, ReadBytesExt}; use std::io::Cursor; use std::io::Read; @@ -58,11 +57,8 @@ fn demux(mut stream: impl Read) -> Vec { match stream.read_exact(&mut header) { Ok(_) => { let payload_size: Vec = header[4..8].to_vec(); - let mut buffer = vec![ - 0; - Cursor::new(&payload_size).read_u32::().unwrap() - as usize - ]; + let mut buffer = + vec![0; Cursor::new(&payload_size).read_u32::().unwrap() as usize]; match stream.read_exact(&mut buffer) { Ok(_) => { match header[0] { -- cgit v1.2.3