Skip to content

Commit

Permalink
Refactor parse methods for CrossToml
Browse files Browse the repository at this point in the history
  • Loading branch information
mntns committed Jun 21, 2022
1 parent 45deb0f commit f8ce849
Show file tree
Hide file tree
Showing 4 changed files with 37 additions and 30 deletions.
4 changes: 3 additions & 1 deletion src/config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -341,7 +341,9 @@ mod tests {
use std::matches;

fn toml(content: &str) -> Result<crate::CrossToml> {
Ok(CrossToml::parse(content).wrap_err("couldn't parse toml")?.0)
Ok(CrossToml::parse_from_cross(content)
.wrap_err("couldn't parse toml")?
.0)
}

#[test]
Expand Down
19 changes: 15 additions & 4 deletions src/cross_toml.rs
Original file line number Diff line number Diff line change
Expand Up @@ -48,8 +48,19 @@ pub struct CrossToml {
}

impl CrossToml {
/// Parses the [`CrossToml`] from all of the config sources
pub fn parse(cargo_toml: &str, cross_toml: &str) -> Result<(Self, BTreeSet<String>)> {
let (cross_toml, unused) = Self::parse_from_cross(cross_toml)?;

if let Some((cargo_toml, _)) = Self::parse_from_cargo(cargo_toml)? {
Ok((cargo_toml.merge(cross_toml)?, unused))
} else {
Ok((cross_toml, unused))
}
}

/// Parses the [`CrossToml`] from a string
pub fn parse(toml_str: &str) -> Result<(Self, BTreeSet<String>)> {
pub fn parse_from_cross(toml_str: &str) -> Result<(Self, BTreeSet<String>)> {
let mut tomld = toml::Deserializer::new(toml_str);
Self::parse_from_deserializer(&mut tomld)
}
Expand Down Expand Up @@ -249,7 +260,7 @@ mod tests {
targets: HashMap::new(),
build: CrossBuildConfig::default(),
};
let (parsed_cfg, unused) = CrossToml::parse("")?;
let (parsed_cfg, unused) = CrossToml::parse_from_cross("")?;

assert_eq!(parsed_cfg, cfg);
assert!(unused.is_empty());
Expand Down Expand Up @@ -280,7 +291,7 @@ mod tests {
volumes = ["VOL1_ARG", "VOL2_ARG"]
passthrough = ["VAR1", "VAR2"]
"#;
let (parsed_cfg, unused) = CrossToml::parse(test_str)?;
let (parsed_cfg, unused) = CrossToml::parse_from_cross(test_str)?;

assert_eq!(parsed_cfg, cfg);
assert!(unused.is_empty());
Expand Down Expand Up @@ -321,7 +332,7 @@ mod tests {
build-std = true
image = "test-image"
"#;
let (parsed_cfg, unused) = CrossToml::parse(test_str)?;
let (parsed_cfg, unused) = CrossToml::parse_from_cross(test_str)?;

assert_eq!(parsed_cfg, cfg);
assert!(unused.is_empty());
Expand Down
36 changes: 14 additions & 22 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -540,37 +540,29 @@ fn toml(metadata: &CargoMetadata) -> Result<Option<CrossToml>> {
// Attempts to read the cross config from the Cargo.toml
let cargo_toml_str =
file::read(root.join("Cargo.toml")).wrap_err("failed to read Cargo.toml")?;
let cargo_cross_toml_opt = CrossToml::parse_from_cargo(&cargo_toml_str)?;

match (
cross_config_path.exists(),
cargo_cross_toml_opt.map(|(cfg, _)| cfg),
) {
(true, cargo_cross_cfg) => {
let content = file::read(&cross_config_path).wrap_err_with(|| {
format!("could not read file `{}`", cross_config_path.display())
})?;

let (config, _) = CrossToml::parse(&content).wrap_err_with(|| {
if cross_config_path.exists() {
let cross_toml_str = file::read(&cross_config_path)
.wrap_err_with(|| format!("could not read file `{}`", cross_config_path.display()))?;

let (config, _) =
CrossToml::parse(&cargo_toml_str, &cross_toml_str).wrap_err_with(|| {
format!(
"failed to parse file `{}` as TOML",
cross_config_path.display()
)
})?;

if let Some(cfg) = cargo_cross_cfg {
Ok(Some(cfg.merge(config)?))
} else {
Ok(Some(config))
}
Ok(Some(config))
} else {
// Checks if there is a lowercase version of this file
if root.join("cross.toml").exists() {
eprintln!("There's a file named cross.toml, instead of Cross.toml. You may want to rename it, or it won't be considered.");
}
(false, Some(cfg)) => Ok(Some(cfg)),
(false, None) => {
// Checks if there is a lowercase version of this file
if root.join("cross.toml").exists() {
eprintln!("There's a file named cross.toml, instead of Cross.toml. You may want to rename it, or it won't be considered.");
}

if let Some((cfg, _)) = CrossToml::parse_from_cargo(&cargo_toml_str)? {
Ok(Some(cfg))
} else {
Ok(None)
}
}
Expand Down
8 changes: 5 additions & 3 deletions src/tests/toml.rs
Original file line number Diff line number Diff line change
Expand Up @@ -41,9 +41,11 @@ fn toml_check() -> Result<(), Box<dyn std::error::Error>> {
dir_entry.path().display(),
text_line_no(&contents, fence.range().start),
);
assert!(crate::cross_toml::CrossToml::parse(fence.as_str())?
.1
.is_empty());
assert!(
crate::cross_toml::CrossToml::parse_from_cross(fence.as_str())?
.1
.is_empty()
);
}
}
Ok(())
Expand Down

0 comments on commit f8ce849

Please sign in to comment.