use super::common::*;
#[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, RawOr<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub target: Option<RawOr<String>>,
#[doc(hidden)]
#[serde(default, skip_serializing, skip_deserializing)]
pub _hidden: (),
}
derive_standard_impls_for!(Build, {
context, dockerfile, args, target, _hidden
});
impl Build {
pub fn new<C: Into<Context>>(ctx: C) -> Self {
Build {
context: value(ctx.into()),
dockerfile: Default::default(),
args: Default::default(),
target: Default::default(),
_hidden: (),
}
}
}
impl FromStr for Build {
type Err = Void;
fn from_str(s: &str) -> result::Result<Self, Self::Err> {
Ok(Build::new(Context::new(s)))
}
}
impl SerializeStringOrStruct for Build {
fn serialize_string_or_struct<S>(
&self,
serializer: S,
) -> result::Result<S::Ok, 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")
.expect("wanted key 'key'")
.value()
.unwrap(),
"value"
);
}
#[test]
fn args_support_stringification_and_interpolation() {
use super::interpolation::OsEnvironment;
let yaml = r#"---
context: .
args:
bool: true
float: 1.5
int: 1
interp: $FOO
"#;
let build: Build = serde_yaml::from_str(yaml).unwrap();
assert_eq!(
build
.args
.get("bool")
.expect("wanted key 'bool'")
.value()
.unwrap(),
"true"
);
assert_eq!(
build
.args
.get("float")
.expect("wanted key 'float'")
.value()
.unwrap(),
"1.5"
);
assert_eq!(
build
.args
.get("int")
.expect("wanted key 'int'")
.value()
.unwrap(),
"1"
);
let mut interp: RawOr<String> = build
.args
.get("interp")
.expect("wanted key 'interp'")
.to_owned();
env::set_var("FOO", "foo");
let env = OsEnvironment::new();
assert_eq!(interp.interpolate_env(&env).unwrap(), "foo")
}
#[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")
.expect("should have key")
.value()
.unwrap(),
"value"
);
}