tar = { version = "0.4.36", default-features = false }
tempfile = "3.0"
termcolor = "1.1"
-toml = "0.5.7"
+toml_edit = { version = "0.13", features = ["serde", "easy"] }
unicode-xid = "0.2.0"
url = "2.2.2"
walkdir = "2.2"
cargo_metadata = "0.14.0"
flate2 = { version = "1.0.3", default-features = false, features = ["zlib"] }
tar = { version = "0.4.35", default-features = false }
-toml = "0.5.8"
+toml_edit = { version = "0.9.1", features = ["easy"] }
use std::fs;
use std::path::{Path, PathBuf};
use std::process::Command;
+use toml_edit::easy as toml;
fn main() {
let force = std::env::args().any(|arg| arg == "-f");
serde_json = "1.0"
tar = { version = "0.4.18", default-features = false }
termcolor = "1.1.2"
-toml = "0.5.7"
+toml_edit = { version = "0.9.1", features = ["serde", "easy"] }
url = "2.2.2"
[features]
if !self.cargo_features.is_empty() {
manifest.push_str(&format!(
"cargo-features = {}\n\n",
- toml::to_string(&self.cargo_features).unwrap()
+ toml_edit::ser::to_item(&self.cargo_features).unwrap()
));
}
use semver::Version;
use serde::ser;
use serde::Serialize;
+use toml_edit::easy as toml;
use url::Url;
use crate::core::compiler::{CompileKind, CrateType};
use log::{debug, warn};
use semver::Version;
use serde::Serialize;
+use toml_edit::easy as toml;
use crate::core::compiler::{CompileKind, RustcTargetData};
use crate::core::dependency::DepKind;
.manifest()
.original()
.prepare_for_publish(ws, self.root())?;
- let toml = toml::to_string(&manifest)?;
+ let toml = toml::to_string_pretty(&manifest)?;
Ok(format!("{}\n{}", MANIFEST_PREAMBLE, toml))
}
use glob::glob;
use itertools::Itertools;
use log::debug;
+use toml_edit::easy as toml;
use url::Url;
use crate::core::features::Features;
config,
"{} = {}{}",
key,
- toml::to_string(&val).unwrap(),
+ toml_edit::Value::from(val),
origin(def)
),
CV::List(vals, _def) => {
if opts.show_origin {
drop_println!(config, "{} = [", key);
for (val, def) in vals {
- drop_println!(config, " {}, # {}", toml::to_string(&val).unwrap(), def);
+ drop_println!(
+ config,
+ " {}, # {}",
+ toml_edit::ser::to_item(&val).unwrap(),
+ def
+ );
}
drop_println!(config, "]");
} else {
- let vals: Vec<&String> = vals.iter().map(|x| &x.0).collect();
- drop_println!(config, "{} = {}", key, toml::to_string(&vals).unwrap());
+ let vals: toml_edit::Array = vals.iter().map(|x| &x.0).collect();
+ drop_println!(config, "{} = {}", key, vals);
}
}
CV::Table(table, _def) => {
use std::path::{Path, PathBuf};
use std::process::Command;
use std::str::{from_utf8, FromStr};
+use toml_edit::easy as toml;
#[derive(Clone, Copy, Debug, PartialEq)]
pub enum VersionControl {
use serde::Serialize;
use std::collections::BTreeMap;
use std::path::PathBuf;
+use toml_edit::easy as toml;
const VERSION: u32 = 1;
use anyhow::{bail, format_err, Context as _};
use serde::{Deserialize, Serialize};
+use toml_edit::easy as toml;
use crate::core::compiler::Freshness;
use crate::core::{Dependency, FeatureValue, Package, PackageId, Source, SourceId};
use crate::util::Filesystem;
use anyhow::Context as _;
+use toml_edit::easy as toml;
pub fn load_pkg_lockfile(ws: &Workspace<'_>) -> CargoResult<Option<Resolve>> {
if !ws.root().join("Cargo.lock").exists() {
}
fn serialize_resolve(resolve: &Resolve, orig: Option<&str>) -> String {
- let toml = toml::Value::try_from(resolve).unwrap();
+ let toml = toml_edit::ser::to_item(resolve).unwrap();
let mut out = String::new();
let deps = toml["package"].as_array().unwrap();
for dep in deps {
- let dep = dep.as_table().unwrap();
+ let dep = dep.as_inline_table().unwrap();
out.push_str("[[package]]\n");
emit_package(dep, &mut out);
let list = patch["unused"].as_array().unwrap();
for entry in list {
out.push_str("[[patch.unused]]\n");
- emit_package(entry.as_table().unwrap(), &mut out);
+ emit_package(entry.as_inline_table().unwrap(), &mut out);
out.push('\n');
}
}
if let Some(meta) = toml.get("metadata") {
- out.push_str("[metadata]\n");
- out.push_str(&meta.to_string());
+ // 1. We need to ensure we print the entire tree, not just the direct members of `metadata`
+ // (which `toml_edit::Table::to_string` only shows)
+ // 2. We need to ensure all children tables have `metadata.` prefix
+ let meta_table = meta
+ .clone()
+ .into_table()
+ .expect("validation ensures this is a table");
+ let mut meta_doc = toml_edit::Document::new();
+ meta_doc["metadata"] = toml_edit::Item::Table(meta_table);
+
+ out.push_str(&meta_doc.to_string());
}
// Historical versions of Cargo in the old format accidentally left trailing
orig.lines().eq(current.lines())
}
-fn emit_package(dep: &toml::value::Table, out: &mut String) {
+fn emit_package(dep: &toml_edit::InlineTable, out: &mut String) {
out.push_str(&format!("name = {}\n", &dep["name"]));
out.push_str(&format!("version = {}\n", &dep["version"]));
use std::fs::{self, File, OpenOptions};
use std::io::{Read, Write};
use std::path::{Path, PathBuf};
+use toml_edit::easy as toml;
pub struct VendorOptions<'a> {
pub no_delete: bool,
Cow::Borrowed(part)
} else {
// This is a bit messy, but toml doesn't expose a function to do this.
- Cow::Owned(toml::to_string(&toml::Value::String(part.to_string())).unwrap())
+ Cow::Owned(toml_edit::Value::from(part).to_string())
}
}
use curl::easy::Easy;
use lazycell::LazyCell;
use serde::Deserialize;
+use toml_edit::easy as toml;
use url::Url;
mod de;
use serde::Deserialize;
use std::collections::{BTreeMap, HashMap};
use std::path::PathBuf;
+use toml_edit::easy as toml;
/// Config definition of a `[target.'cfg(…)']` table.
///
use serde::de;
use serde::ser;
use serde::{Deserialize, Serialize};
+use toml_edit::easy as toml;
use url::Url;
use crate::core::compiler::{CompileKind, CompileTarget};
let pretty_filename = manifest_file
.strip_prefix(config.cwd())
.unwrap_or(manifest_file);
- parse(contents, pretty_filename, config)?
+ parse_document(contents, pretty_filename, config)?
};
// Provide a helpful error message for a common user error.
if let Some(package) = toml.get("package").or_else(|| toml.get("project")) {
if let Some(feats) = package.get("cargo-features") {
+ let mut feats = feats.clone();
+ if let Some(value) = feats.as_value_mut() {
+ // Only keep formatting inside of the `[]` and not formatting around it
+ value.decor_mut().clear();
+ }
bail!(
"cargo-features = {} was found in the wrong location: it \
should be set at the top of Cargo.toml before any tables",
- toml::to_string(feats).unwrap()
+ feats.to_string()
);
}
}
.map_err(|e| anyhow::Error::from(e).context("could not parse input as TOML"))
}
+pub fn parse_document(
+ toml: &str,
+ _file: &Path,
+ _config: &Config,
+) -> CargoResult<toml_edit::Document> {
+ // At the moment, no compatibility checks are needed.
+ toml.parse()
+ .map_err(|e| anyhow::Error::from(e).context("could not parse input as TOML"))
+}
+
type TomlLibTarget = TomlTarget;
type TomlBinTarget = TomlTarget;
type TomlExampleTarget = TomlTarget;
could not parse input as TOML
Caused by:
- expected an equals, found eof at line 1 column 2
+ TOML parse error at line 1, column 2
+ |
+ 1 | 4
+ | ^
+ Unexpected end of input
+ Expected `.` or `=`
",
)
.run();
could not parse input as TOML
Caused by:
- expected a table key, found a newline at line 8 column 27
+ TOML parse error at line 8, column 27
+ |
+ 8 | native = {
+ | ^
+ Unexpected `
+ `
+ Expected key
",
)
.run();
p.cargo("build")
.with_status(101)
- .with_stderr_contains(" expected newline, found an identifier at line 1 column 7")
+ .with_stderr(
+ "\
+error: could not load Cargo configuration
+
+Caused by:
+ could not parse TOML configuration in `[..]`
+
+Caused by:
+ could not parse input as TOML
+
+Caused by:
+ TOML parse error at line 1, column 7
+ |
+ 1 | [bar] baz = 2
+ | ^
+ Unexpected `b`
+ Expected newline or end of input
+ While parsing a Table Header
+",
+ )
.run();
}
could not parse input as TOML
Caused by:
- invalid TOML value, did you mean to use a quoted string? at line 3 column 23
+ TOML parse error at line 3, column 23
+ |
+ 3 | foo = bar
+ | ^
+ Unexpected `b`
+ Expected quoted string
",
)
.run();
could not parse input as TOML
Caused by:
- invalid TOML value, did you mean to use a quoted string? at line 1 column 5
+ TOML parse error at line 1, column 5
+ |
+ 1 | a = bar
+ | ^
+ Unexpected `b`
+ Expected quoted string
",
)
.run();
could not parse input as TOML
Caused by:
- expected an equals, found an identifier at line 1 column 6
+ TOML parse error at line 1, column 6
+ |
+ 1 | this is not valid toml
+ | ^
+ Unexpected `i`
+ Expected `.` or `=`
",
)
.run();
could not parse input as TOML
Caused by:
- expected an equals, found eof at line 1 column 5",
+ TOML parse error at line 1, column 5
+ |
+1 | asdf
+ | ^
+Unexpected end of input
+Expected `.` or `=`",
);
}
// "invalid number" here isn't the best error, but I think it's just toml.rs.
assert_error(
config.get::<L>("bad-env").unwrap_err(),
- "error in environment variable `CARGO_BAD_ENV`: \
- could not parse TOML list: invalid TOML value, did you mean to use a quoted string? at line 1 column 8",
+ "\
+error in environment variable `CARGO_BAD_ENV`: could not parse TOML list: TOML parse error at line 1, column 8
+ |
+1 | value=[zzz]
+ | ^
+Unexpected `z`
+Expected newline or `#`
+",
);
// Try some other sequence-like types.
could not parse input as TOML
Caused by:
- dotted key attempted to extend non-table type at line 2 column 15",
+ TOML parse error at line 3, column 1
+ |
+3 | ssl-version.min = 'tlsv1.2'
+ | ^
+Dotted key `ssl-version` attempted to extend non-table type (string)
+
+",
);
assert!(config
.get::<Option<SslVersionConfig>>("http.ssl-version")
package: Some(overrides),
..base_settings
};
- let profile_toml = ::toml::to_string(&profile).unwrap();
- let roundtrip: toml::TomlProfile = ::toml::from_str(&profile_toml).unwrap();
- let roundtrip_toml = ::toml::to_string(&roundtrip).unwrap();
+ let profile_toml = toml_edit::easy::to_string(&profile).unwrap();
+ let roundtrip: toml::TomlProfile = toml_edit::easy::from_str(&profile_toml).unwrap();
+ let roundtrip_toml = toml_edit::easy::to_string(&roundtrip).unwrap();
compare::assert_match_exact(&profile_toml, &roundtrip_toml);
}
failed to parse --config argument `abc`
Caused by:
- expected an equals, found eof at line 1 column 4",
+ TOML parse error at line 1, column 4
+ |
+1 | abc
+ | ^
+Unexpected end of input
+Expected `.` or `=`
+",
);
}
failed to parse --config argument `missing.toml`
Caused by:
- expected an equals, found eof at line 1 column 13",
+ TOML parse error at line 1, column 13
+ |
+1 | missing.toml
+ | ^
+Unexpected end of input
+Expected `.` or `=`
+",
);
}
description = "foo"
homepage = "https://example.com/"
license = "MIT"
+
[dependencies.opt-dep1]
version = "1.0"
optional = true
description = "foo"
homepage = "https://example.com/"
license = "MIT"
+
[dependencies.bar]
version = "1.0"
optional = true
could not parse input as TOML
Caused by:
- duplicate key: `categories` for key `project` at line 10 column 21",
+ TOML parse error at line 8, column 21
+ |
+ 8 | categories = [\"algorithms\"]
+ | ^
+ Duplicate key `categories` in table `project`
+
+",
path2url(&git_root),
path2url(&git_root),
))
invalid TOML found for metadata
Caused by:
- unexpected character[..]
+ TOML parse error at line 1, column 1
+ |
+ 1 | [..] = { \"foo 0.0.1 (registry+https://github.com/rust-lang/crates.io-index)\" = [\"foo[EXE]\"] }
+ | ^
+ Unexpected `[..]`
+ Expected key or end of input
",
)
.run();
use std::fs;
use std::path::PathBuf;
use std::sync::atomic::{AtomicUsize, Ordering};
+use toml_edit::easy as toml;
use cargo_test_support::install::{cargo_home, exe};
use cargo_test_support::paths::CargoPathExt;
use std::fs::{self, OpenOptions};
use std::io::prelude::*;
use std::path::PathBuf;
+use toml_edit::easy as toml;
const TOKEN: &str = "test-token";
const TOKEN2: &str = "test-token2";
use cargo_test_support::install::cargo_home;
use cargo_test_support::{cargo_process, registry};
use std::fs;
+use toml_edit::easy as toml;
#[cargo_test]
fn gated() {
[package.metadata]
foo = "bar"
+
[dependencies.abc]
version = "1.0"
use cargo_test_support::registry::{self, Package};
use cargo_test_support::{basic_manifest, project};
use std::fs;
+use toml_edit::easy as toml;
#[cargo_test]
fn replace() {
authors = []\n\
description = \"foo\"\n\
license = \"MIT\"\n\
+ \n\
[dependencies.dep1]\n\
version = \"1.0\"\n\
",
documentation = "foo"
license = "MIT"
repository = "foo"
-
-[dev-dependencies]
"#,
cargo::core::package::MANIFEST_PREAMBLE
),
description = "foo"
homepage = "https://example.com/"
license = "MIT"
+
[dependencies.bar]
version = "1.0"
optional = true
could not parse input as TOML
Caused by:
- expected an equals, found eof at line 1 column 5
+ TOML parse error at line 1, column 5
+ |
+ 1 | asdf
+ | ^
+ Unexpected end of input
+ Expected `.` or `=`
Created binary (application) `bar` package
",
)