#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct Build {
pub context: RawOr<Context>,
#[serde(skip_serializing_if = "Option::is_none")]
pub dockerfile: Option<RawOr<String>>,
#[serde(default, skip_serializing_if = "BTreeMap::is_empty",
deserialize_with = "deserialize_map_or_key_value_list")]
pub args: BTreeMap<String, String>,
#[doc(hidden)]
#[serde(default, skip_serializing, skip_deserializing)]
pub _phantom: PhantomData<()>,
}
impl Build {
pub fn new<C: Into<Context>>(ctx: C) -> Self {
Build {
context: value(ctx.into()),
dockerfile: Default::default(),
args: Default::default(),
_phantom: PhantomData,
}
}
}
impl FromStr for Build {
type Err = Void;
fn from_str(s: &str) -> Result<Self, Self::Err> {
Ok(Build::new(Context::new(s)))
}
}
impl SerializeStringOrStruct for Build {
fn serialize_string_or_struct<S>(&self, serializer: &mut S) ->
Result<(), S::Error>
where S: Serializer
{
if self.dockerfile.is_none() && self.args.is_empty() {
self.context.serialize(serializer)
} else {
self.serialize(serializer)
}
}
}
#[test]
fn build_has_a_string_representation() {
let build: Build = Build::from_str(".").unwrap();
assert_eq!(build.context, value(Context::new(".")));
assert_eq!(build.dockerfile, None);
assert_eq!(build.args, Default::default());
}
#[test]
fn build_may_be_a_struct() {
let yaml = r#"---
"args":
"key": "value"
"context": "."
"dockerfile": "Dockerfile"
"#;
assert_roundtrip!(Build, yaml);
let build: Build = serde_yaml::from_str(yaml).unwrap();
assert_eq!(build.context, value(Context::new(".")));
assert_eq!(build.dockerfile, Some(value("Dockerfile".to_owned())));
assert_eq!(build.args.get("key").cloned(), Some("value".to_owned()));
}
#[test]
fn build_args_may_be_a_key_value_list() {
let yaml = "---
context: \".\"
args:
- \"key=value\"
";
let build: Build = serde_yaml::from_str(yaml).unwrap();
assert_eq!(build.args.get("key").cloned(), Some("value".to_owned()));
}