Skip to content

Commit d719020

Browse files
committed
Fix error when using certain config values in Cargo.toml
`pre-build = "file"` had a bad serialization (cherry picked from commit 6a57d01)
1 parent b6813bf commit d719020

File tree

3 files changed

+45
-5
lines changed

3 files changed

+45
-5
lines changed

src/cross_toml.rs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -680,6 +680,28 @@ mod tests {
680680
Ok(())
681681
}
682682

683+
#[test]
684+
pub fn fully_populated_roundtrip() -> Result<()> {
685+
let cfg = r#"
686+
[target.a]
687+
xargo = false
688+
build-std = true
689+
image = "local"
690+
dockerfile.file = "Dockerfile"
691+
dockerfile.context = ".."
692+
pre-build = ["sh"]
693+
zig = true
694+
695+
[target.b]
696+
pre-build = "sh"
697+
zig = "2.17"
698+
"#;
699+
700+
let (cfg, _) = CrossToml::parse_from_cross(cfg, &mut m!())?;
701+
serde_json::from_value::<CrossToml>(serde_json::to_value(cfg)?)?;
702+
Ok(())
703+
}
704+
683705
#[test]
684706
pub fn merge() -> Result<()> {
685707
let cfg1_str = r#"

src/docker/custom.rs

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,29 @@ pub enum Dockerfile<'a> {
2323
},
2424
}
2525

26-
#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
26+
#[derive(Debug, Clone, PartialEq, Eq, serde::Deserialize)]
2727
pub enum PreBuild {
2828
/// A path to a file to copy or a single line to `RUN` if line comes from env
2929
Single { line: String, env: bool },
3030
/// Lines to execute in a single `RUN`
3131
Lines(Vec<String>),
3232
}
3333

34+
impl serde::Serialize for PreBuild {
35+
fn serialize<S: serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
36+
match self {
37+
PreBuild::Single { line, .. } => serializer.serialize_str(line),
38+
PreBuild::Lines(lines) => {
39+
use serde::ser::SerializeSeq;
40+
let mut seq = serializer.serialize_seq(Some(lines.len()))?;
41+
for line in lines {
42+
seq.serialize_element(line)?;
43+
}
44+
seq.end()
45+
}
46+
}
47+
}
48+
}
3449
impl FromStr for PreBuild {
3550
type Err = std::convert::Infallible;
3651

src/tests/toml.rs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -60,14 +60,17 @@ fn toml_check() -> Result<(), Box<dyn std::error::Error>> {
6060
text_line_no(&contents, fence.range().start),
6161
);
6262
let mut msg_info = crate::shell::MessageInfo::default();
63-
assert!(if !cargo {
63+
let toml = if !cargo {
6464
crate::cross_toml::CrossToml::parse_from_cross(&fence_content, &mut msg_info)?
6565
} else {
6666
crate::cross_toml::CrossToml::parse_from_cargo(&fence_content, &mut msg_info)?
6767
.unwrap_or_default()
68-
}
69-
.1
70-
.is_empty());
68+
};
69+
assert!(toml.1.is_empty());
70+
71+
// TODO: Add serde_path_to_error
72+
// Check if roundtrip works, needed for merging Cross.toml and Cargo.toml
73+
serde_json::from_value::<crate::cross_toml::CrossToml>(serde_json::to_value(toml.0)?)?;
7174
}
7275
}
7376
Ok(())

0 commit comments

Comments
 (0)