1use crate::directory::Directory;
2use crate::error::{Error, Result};
3use crate::manifest::Name;
4use crate::run::Project;
5use crate::rustflags;
6use serde_derive::Deserialize;
7use std::fs::File;
8use std::path::PathBuf;
9use std::process::{Command, Output, Stdio};
10use std::{env, io, iter};
11use target_triple::TARGET;
12
13#[derive(#[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
{
#[allow(unused_extern_crates, clippy :: useless_attribute)]
extern crate serde as _serde;
;
#[automatically_derived]
impl<'de> _serde::Deserialize<'de> for Metadata {
fn deserialize<__D>(__deserializer: __D)
-> _serde::__private228::Result<Self, __D::Error> where
__D: _serde::Deserializer<'de> {
#[allow(non_camel_case_types)]
#[doc(hidden)]
enum __Field { __field0, __field1, __field2, __ignore, }
#[doc(hidden)]
struct __FieldVisitor;
#[automatically_derived]
impl<'de> _serde::de::Visitor<'de> for __FieldVisitor {
type Value = __Field;
fn expecting(&self,
__formatter: &mut _serde::__private228::Formatter)
-> _serde::__private228::fmt::Result {
_serde::__private228::Formatter::write_str(__formatter,
"field identifier")
}
fn visit_u64<__E>(self, __value: u64)
-> _serde::__private228::Result<Self::Value, __E> where
__E: _serde::de::Error {
match __value {
0u64 => _serde::__private228::Ok(__Field::__field0),
1u64 => _serde::__private228::Ok(__Field::__field1),
2u64 => _serde::__private228::Ok(__Field::__field2),
_ => _serde::__private228::Ok(__Field::__ignore),
}
}
fn visit_str<__E>(self, __value: &str)
-> _serde::__private228::Result<Self::Value, __E> where
__E: _serde::de::Error {
match __value {
"target_directory" =>
_serde::__private228::Ok(__Field::__field0),
"workspace_root" =>
_serde::__private228::Ok(__Field::__field1),
"packages" => _serde::__private228::Ok(__Field::__field2),
_ => { _serde::__private228::Ok(__Field::__ignore) }
}
}
fn visit_bytes<__E>(self, __value: &[u8])
-> _serde::__private228::Result<Self::Value, __E> where
__E: _serde::de::Error {
match __value {
b"target_directory" =>
_serde::__private228::Ok(__Field::__field0),
b"workspace_root" =>
_serde::__private228::Ok(__Field::__field1),
b"packages" => _serde::__private228::Ok(__Field::__field2),
_ => { _serde::__private228::Ok(__Field::__ignore) }
}
}
}
#[automatically_derived]
impl<'de> _serde::Deserialize<'de> for __Field {
#[inline]
fn deserialize<__D>(__deserializer: __D)
-> _serde::__private228::Result<Self, __D::Error> where
__D: _serde::Deserializer<'de> {
_serde::Deserializer::deserialize_identifier(__deserializer,
__FieldVisitor)
}
}
#[doc(hidden)]
struct __Visitor<'de> {
marker: _serde::__private228::PhantomData<Metadata>,
lifetime: _serde::__private228::PhantomData<&'de ()>,
}
#[automatically_derived]
impl<'de> _serde::de::Visitor<'de> for __Visitor<'de> {
type Value = Metadata;
fn expecting(&self,
__formatter: &mut _serde::__private228::Formatter)
-> _serde::__private228::fmt::Result {
_serde::__private228::Formatter::write_str(__formatter,
"struct Metadata")
}
#[inline]
fn visit_seq<__A>(self, mut __seq: __A)
-> _serde::__private228::Result<Self::Value, __A::Error>
where __A: _serde::de::SeqAccess<'de> {
let __field0 =
match _serde::de::SeqAccess::next_element::<Directory>(&mut __seq)?
{
_serde::__private228::Some(__value) => __value,
_serde::__private228::None =>
return _serde::__private228::Err(_serde::de::Error::invalid_length(0usize,
&"struct Metadata with 3 elements")),
};
let __field1 =
match _serde::de::SeqAccess::next_element::<Directory>(&mut __seq)?
{
_serde::__private228::Some(__value) => __value,
_serde::__private228::None =>
return _serde::__private228::Err(_serde::de::Error::invalid_length(1usize,
&"struct Metadata with 3 elements")),
};
let __field2 =
match _serde::de::SeqAccess::next_element::<Vec<PackageMetadata>>(&mut __seq)?
{
_serde::__private228::Some(__value) => __value,
_serde::__private228::None =>
return _serde::__private228::Err(_serde::de::Error::invalid_length(2usize,
&"struct Metadata with 3 elements")),
};
_serde::__private228::Ok(Metadata {
target_directory: __field0,
workspace_root: __field1,
packages: __field2,
})
}
#[inline]
fn visit_map<__A>(self, mut __map: __A)
-> _serde::__private228::Result<Self::Value, __A::Error>
where __A: _serde::de::MapAccess<'de> {
let mut __field0: _serde::__private228::Option<Directory> =
_serde::__private228::None;
let mut __field1: _serde::__private228::Option<Directory> =
_serde::__private228::None;
let mut __field2:
_serde::__private228::Option<Vec<PackageMetadata>> =
_serde::__private228::None;
while let _serde::__private228::Some(__key) =
_serde::de::MapAccess::next_key::<__Field>(&mut __map)? {
match __key {
__Field::__field0 => {
if _serde::__private228::Option::is_some(&__field0) {
return _serde::__private228::Err(<__A::Error as
_serde::de::Error>::duplicate_field("target_directory"));
}
__field0 =
_serde::__private228::Some(_serde::de::MapAccess::next_value::<Directory>(&mut __map)?);
}
__Field::__field1 => {
if _serde::__private228::Option::is_some(&__field1) {
return _serde::__private228::Err(<__A::Error as
_serde::de::Error>::duplicate_field("workspace_root"));
}
__field1 =
_serde::__private228::Some(_serde::de::MapAccess::next_value::<Directory>(&mut __map)?);
}
__Field::__field2 => {
if _serde::__private228::Option::is_some(&__field2) {
return _serde::__private228::Err(<__A::Error as
_serde::de::Error>::duplicate_field("packages"));
}
__field2 =
_serde::__private228::Some(_serde::de::MapAccess::next_value::<Vec<PackageMetadata>>(&mut __map)?);
}
_ => {
let _ =
_serde::de::MapAccess::next_value::<_serde::de::IgnoredAny>(&mut __map)?;
}
}
}
let __field0 =
match __field0 {
_serde::__private228::Some(__field0) => __field0,
_serde::__private228::None =>
_serde::__private228::de::missing_field("target_directory")?,
};
let __field1 =
match __field1 {
_serde::__private228::Some(__field1) => __field1,
_serde::__private228::None =>
_serde::__private228::de::missing_field("workspace_root")?,
};
let __field2 =
match __field2 {
_serde::__private228::Some(__field2) => __field2,
_serde::__private228::None =>
_serde::__private228::de::missing_field("packages")?,
};
_serde::__private228::Ok(Metadata {
target_directory: __field0,
workspace_root: __field1,
packages: __field2,
})
}
}
#[doc(hidden)]
const FIELDS: &'static [&'static str] =
&["target_directory", "workspace_root", "packages"];
_serde::Deserializer::deserialize_struct(__deserializer,
"Metadata", FIELDS,
__Visitor {
marker: _serde::__private228::PhantomData::<Metadata>,
lifetime: _serde::__private228::PhantomData,
})
}
}
};Deserialize)]
14pub struct Metadata {
15 pub target_directory: Directory,
16 pub workspace_root: Directory,
17 pub packages: Vec<PackageMetadata>,
18}
19
20#[derive(#[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
{
#[allow(unused_extern_crates, clippy :: useless_attribute)]
extern crate serde as _serde;
;
#[automatically_derived]
impl<'de> _serde::Deserialize<'de> for PackageMetadata {
fn deserialize<__D>(__deserializer: __D)
-> _serde::__private228::Result<Self, __D::Error> where
__D: _serde::Deserializer<'de> {
#[allow(non_camel_case_types)]
#[doc(hidden)]
enum __Field { __field0, __field1, __field2, __ignore, }
#[doc(hidden)]
struct __FieldVisitor;
#[automatically_derived]
impl<'de> _serde::de::Visitor<'de> for __FieldVisitor {
type Value = __Field;
fn expecting(&self,
__formatter: &mut _serde::__private228::Formatter)
-> _serde::__private228::fmt::Result {
_serde::__private228::Formatter::write_str(__formatter,
"field identifier")
}
fn visit_u64<__E>(self, __value: u64)
-> _serde::__private228::Result<Self::Value, __E> where
__E: _serde::de::Error {
match __value {
0u64 => _serde::__private228::Ok(__Field::__field0),
1u64 => _serde::__private228::Ok(__Field::__field1),
2u64 => _serde::__private228::Ok(__Field::__field2),
_ => _serde::__private228::Ok(__Field::__ignore),
}
}
fn visit_str<__E>(self, __value: &str)
-> _serde::__private228::Result<Self::Value, __E> where
__E: _serde::de::Error {
match __value {
"name" => _serde::__private228::Ok(__Field::__field0),
"targets" => _serde::__private228::Ok(__Field::__field1),
"manifest_path" =>
_serde::__private228::Ok(__Field::__field2),
_ => { _serde::__private228::Ok(__Field::__ignore) }
}
}
fn visit_bytes<__E>(self, __value: &[u8])
-> _serde::__private228::Result<Self::Value, __E> where
__E: _serde::de::Error {
match __value {
b"name" => _serde::__private228::Ok(__Field::__field0),
b"targets" => _serde::__private228::Ok(__Field::__field1),
b"manifest_path" =>
_serde::__private228::Ok(__Field::__field2),
_ => { _serde::__private228::Ok(__Field::__ignore) }
}
}
}
#[automatically_derived]
impl<'de> _serde::Deserialize<'de> for __Field {
#[inline]
fn deserialize<__D>(__deserializer: __D)
-> _serde::__private228::Result<Self, __D::Error> where
__D: _serde::Deserializer<'de> {
_serde::Deserializer::deserialize_identifier(__deserializer,
__FieldVisitor)
}
}
#[doc(hidden)]
struct __Visitor<'de> {
marker: _serde::__private228::PhantomData<PackageMetadata>,
lifetime: _serde::__private228::PhantomData<&'de ()>,
}
#[automatically_derived]
impl<'de> _serde::de::Visitor<'de> for __Visitor<'de> {
type Value = PackageMetadata;
fn expecting(&self,
__formatter: &mut _serde::__private228::Formatter)
-> _serde::__private228::fmt::Result {
_serde::__private228::Formatter::write_str(__formatter,
"struct PackageMetadata")
}
#[inline]
fn visit_seq<__A>(self, mut __seq: __A)
-> _serde::__private228::Result<Self::Value, __A::Error>
where __A: _serde::de::SeqAccess<'de> {
let __field0 =
match _serde::de::SeqAccess::next_element::<String>(&mut __seq)?
{
_serde::__private228::Some(__value) => __value,
_serde::__private228::None =>
return _serde::__private228::Err(_serde::de::Error::invalid_length(0usize,
&"struct PackageMetadata with 3 elements")),
};
let __field1 =
match _serde::de::SeqAccess::next_element::<Vec<BuildTarget>>(&mut __seq)?
{
_serde::__private228::Some(__value) => __value,
_serde::__private228::None =>
return _serde::__private228::Err(_serde::de::Error::invalid_length(1usize,
&"struct PackageMetadata with 3 elements")),
};
let __field2 =
match _serde::de::SeqAccess::next_element::<PathBuf>(&mut __seq)?
{
_serde::__private228::Some(__value) => __value,
_serde::__private228::None =>
return _serde::__private228::Err(_serde::de::Error::invalid_length(2usize,
&"struct PackageMetadata with 3 elements")),
};
_serde::__private228::Ok(PackageMetadata {
name: __field0,
targets: __field1,
manifest_path: __field2,
})
}
#[inline]
fn visit_map<__A>(self, mut __map: __A)
-> _serde::__private228::Result<Self::Value, __A::Error>
where __A: _serde::de::MapAccess<'de> {
let mut __field0: _serde::__private228::Option<String> =
_serde::__private228::None;
let mut __field1:
_serde::__private228::Option<Vec<BuildTarget>> =
_serde::__private228::None;
let mut __field2: _serde::__private228::Option<PathBuf> =
_serde::__private228::None;
while let _serde::__private228::Some(__key) =
_serde::de::MapAccess::next_key::<__Field>(&mut __map)? {
match __key {
__Field::__field0 => {
if _serde::__private228::Option::is_some(&__field0) {
return _serde::__private228::Err(<__A::Error as
_serde::de::Error>::duplicate_field("name"));
}
__field0 =
_serde::__private228::Some(_serde::de::MapAccess::next_value::<String>(&mut __map)?);
}
__Field::__field1 => {
if _serde::__private228::Option::is_some(&__field1) {
return _serde::__private228::Err(<__A::Error as
_serde::de::Error>::duplicate_field("targets"));
}
__field1 =
_serde::__private228::Some(_serde::de::MapAccess::next_value::<Vec<BuildTarget>>(&mut __map)?);
}
__Field::__field2 => {
if _serde::__private228::Option::is_some(&__field2) {
return _serde::__private228::Err(<__A::Error as
_serde::de::Error>::duplicate_field("manifest_path"));
}
__field2 =
_serde::__private228::Some(_serde::de::MapAccess::next_value::<PathBuf>(&mut __map)?);
}
_ => {
let _ =
_serde::de::MapAccess::next_value::<_serde::de::IgnoredAny>(&mut __map)?;
}
}
}
let __field0 =
match __field0 {
_serde::__private228::Some(__field0) => __field0,
_serde::__private228::None =>
_serde::__private228::de::missing_field("name")?,
};
let __field1 =
match __field1 {
_serde::__private228::Some(__field1) => __field1,
_serde::__private228::None =>
_serde::__private228::de::missing_field("targets")?,
};
let __field2 =
match __field2 {
_serde::__private228::Some(__field2) => __field2,
_serde::__private228::None =>
_serde::__private228::de::missing_field("manifest_path")?,
};
_serde::__private228::Ok(PackageMetadata {
name: __field0,
targets: __field1,
manifest_path: __field2,
})
}
}
#[doc(hidden)]
const FIELDS: &'static [&'static str] =
&["name", "targets", "manifest_path"];
_serde::Deserializer::deserialize_struct(__deserializer,
"PackageMetadata", FIELDS,
__Visitor {
marker: _serde::__private228::PhantomData::<PackageMetadata>,
lifetime: _serde::__private228::PhantomData,
})
}
}
};Deserialize)]
21pub struct PackageMetadata {
22 pub name: String,
23 pub targets: Vec<BuildTarget>,
24 pub manifest_path: PathBuf,
25}
26
27#[derive(#[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
{
#[allow(unused_extern_crates, clippy :: useless_attribute)]
extern crate serde as _serde;
;
#[automatically_derived]
impl<'de> _serde::Deserialize<'de> for BuildTarget {
fn deserialize<__D>(__deserializer: __D)
-> _serde::__private228::Result<Self, __D::Error> where
__D: _serde::Deserializer<'de> {
#[allow(non_camel_case_types)]
#[doc(hidden)]
enum __Field { __field0, __ignore, }
#[doc(hidden)]
struct __FieldVisitor;
#[automatically_derived]
impl<'de> _serde::de::Visitor<'de> for __FieldVisitor {
type Value = __Field;
fn expecting(&self,
__formatter: &mut _serde::__private228::Formatter)
-> _serde::__private228::fmt::Result {
_serde::__private228::Formatter::write_str(__formatter,
"field identifier")
}
fn visit_u64<__E>(self, __value: u64)
-> _serde::__private228::Result<Self::Value, __E> where
__E: _serde::de::Error {
match __value {
0u64 => _serde::__private228::Ok(__Field::__field0),
_ => _serde::__private228::Ok(__Field::__ignore),
}
}
fn visit_str<__E>(self, __value: &str)
-> _serde::__private228::Result<Self::Value, __E> where
__E: _serde::de::Error {
match __value {
"crate_types" =>
_serde::__private228::Ok(__Field::__field0),
_ => { _serde::__private228::Ok(__Field::__ignore) }
}
}
fn visit_bytes<__E>(self, __value: &[u8])
-> _serde::__private228::Result<Self::Value, __E> where
__E: _serde::de::Error {
match __value {
b"crate_types" =>
_serde::__private228::Ok(__Field::__field0),
_ => { _serde::__private228::Ok(__Field::__ignore) }
}
}
}
#[automatically_derived]
impl<'de> _serde::Deserialize<'de> for __Field {
#[inline]
fn deserialize<__D>(__deserializer: __D)
-> _serde::__private228::Result<Self, __D::Error> where
__D: _serde::Deserializer<'de> {
_serde::Deserializer::deserialize_identifier(__deserializer,
__FieldVisitor)
}
}
#[doc(hidden)]
struct __Visitor<'de> {
marker: _serde::__private228::PhantomData<BuildTarget>,
lifetime: _serde::__private228::PhantomData<&'de ()>,
}
#[automatically_derived]
impl<'de> _serde::de::Visitor<'de> for __Visitor<'de> {
type Value = BuildTarget;
fn expecting(&self,
__formatter: &mut _serde::__private228::Formatter)
-> _serde::__private228::fmt::Result {
_serde::__private228::Formatter::write_str(__formatter,
"struct BuildTarget")
}
#[inline]
fn visit_seq<__A>(self, mut __seq: __A)
-> _serde::__private228::Result<Self::Value, __A::Error>
where __A: _serde::de::SeqAccess<'de> {
let __field0 =
match _serde::de::SeqAccess::next_element::<Vec<String>>(&mut __seq)?
{
_serde::__private228::Some(__value) => __value,
_serde::__private228::None =>
return _serde::__private228::Err(_serde::de::Error::invalid_length(0usize,
&"struct BuildTarget with 1 element")),
};
_serde::__private228::Ok(BuildTarget {
crate_types: __field0,
})
}
#[inline]
fn visit_map<__A>(self, mut __map: __A)
-> _serde::__private228::Result<Self::Value, __A::Error>
where __A: _serde::de::MapAccess<'de> {
let mut __field0:
_serde::__private228::Option<Vec<String>> =
_serde::__private228::None;
while let _serde::__private228::Some(__key) =
_serde::de::MapAccess::next_key::<__Field>(&mut __map)? {
match __key {
__Field::__field0 => {
if _serde::__private228::Option::is_some(&__field0) {
return _serde::__private228::Err(<__A::Error as
_serde::de::Error>::duplicate_field("crate_types"));
}
__field0 =
_serde::__private228::Some(_serde::de::MapAccess::next_value::<Vec<String>>(&mut __map)?);
}
_ => {
let _ =
_serde::de::MapAccess::next_value::<_serde::de::IgnoredAny>(&mut __map)?;
}
}
}
let __field0 =
match __field0 {
_serde::__private228::Some(__field0) => __field0,
_serde::__private228::None =>
_serde::__private228::de::missing_field("crate_types")?,
};
_serde::__private228::Ok(BuildTarget {
crate_types: __field0,
})
}
}
#[doc(hidden)]
const FIELDS: &'static [&'static str] = &["crate_types"];
_serde::Deserializer::deserialize_struct(__deserializer,
"BuildTarget", FIELDS,
__Visitor {
marker: _serde::__private228::PhantomData::<BuildTarget>,
lifetime: _serde::__private228::PhantomData,
})
}
}
};Deserialize)]
28pub struct BuildTarget {
29 pub crate_types: Vec<String>,
30}
31
32fn raw_cargo() -> Command {
33 match env::var_os("CARGO") {
34 Some(cargo) => Command::new(cargo),
35 None => Command::new("cargo"),
36 }
37}
38
39pub fn cargo(project: &Project) -> Command {
40 let mut cmd = raw_cargo();
41 cmd.current_dir(&project.dir);
42 cmd.envs(cargo_target_dir(project));
43 cmd.env_remove("RUSTFLAGS");
44 cmd.env("CARGO_INCREMENTAL", "0");
45 cmd.arg("--offline");
46
47 let rustflags = rustflags::toml();
48 cmd.arg(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("--config=build.rustflags={0}",
rustflags))
})format!("--config=build.rustflags={rustflags}"));
49 cmd.arg(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("--config=target.{0}.rustflags={1}",
TARGET, rustflags))
})format!("--config=target.{TARGET}.rustflags={rustflags}"));
50
51 cmd
52}
53
54fn cargo_target_dir(project: &Project) -> impl Iterator<Item = (&'static str, PathBuf)> {
55 iter::once((
56 "CARGO_TARGET_DIR",
57 {
let mut path = std::path::PathBuf::new();
path.push(&(project.target_dir));
path.push(&("tests"));
path.push(&("trybuild"));
path
}path!(project.target_dir / "tests" / "trybuild"),
58 ))
59}
60
61pub fn manifest_dir() -> Result<Directory> {
62 if let Some(manifest_dir) = env::var_os("CARGO_MANIFEST_DIR") {
63 return Ok(Directory::from(manifest_dir));
64 }
65 let mut dir = Directory::current()?;
66 loop {
67 if dir.join("Cargo.toml").exists() {
68 return Ok(dir);
69 }
70 dir = dir.parent().ok_or(Error::ProjectDir)?;
71 }
72}
73
74pub(crate) fn build_dependencies(project: &mut Project) -> Result<()> {
75 match File::open({
let mut path = std::path::PathBuf::new();
path.push(&(project.workspace));
path.push(&("Cargo.lock"));
path
}path!(project.workspace / "Cargo.lock")) {
77 Ok(mut workspace_cargo_lock) => {
78 if let Ok(mut new_cargo_lock) = File::create({
let mut path = std::path::PathBuf::new();
path.push(&(project.dir));
path.push(&("Cargo.lock"));
path
}path!(project.dir / "Cargo.lock")) {
79 let _ = io::copy(&mut workspace_cargo_lock, &mut new_cargo_lock);
82 }
83 }
84 Err(err) => {
85 if err.kind() == io::ErrorKind::NotFound {
86 let _ = cargo(project).arg("generate-lockfile").status();
87 }
88 }
89 }
90
91 let mut command = cargo(project);
92 command
93 .arg(if project.has_pass { "build" } else { "check" })
94 .args(target())
95 .arg("--bin")
96 .arg(&project.name)
97 .args(features(project));
98
99 let status = command.status().map_err(Error::Cargo)?;
100 if !status.success() {
101 return Err(Error::CargoFail);
102 }
103
104 project.keep_going = command
106 .arg("--keep-going")
107 .stdout(Stdio::null())
108 .stderr(Stdio::null())
109 .status()
110 .map(|status| status.success())
111 .unwrap_or(false);
112
113 Ok(())
114}
115
116pub fn build_test(project: &Project, name: &Name) -> Result<Output> {
117 let _ = cargo(project)
118 .arg("clean")
119 .arg("--package")
120 .arg(&project.name)
121 .arg("--color=never")
122 .stdout(Stdio::null())
123 .stderr(Stdio::null())
124 .status();
125
126 cargo(project)
127 .arg(if project.has_pass { "build" } else { "check" })
128 .args(target())
129 .arg("--bin")
130 .arg(name)
131 .args(features(project))
132 .arg("--quiet")
133 .arg("--color=never")
134 .arg("--message-format=json")
135 .output()
136 .map_err(Error::Cargo)
137}
138
139pub fn build_all_tests(project: &Project) -> Result<Output> {
140 let _ = cargo(project)
141 .arg("clean")
142 .arg("--package")
143 .arg(&project.name)
144 .arg("--color=never")
145 .stdout(Stdio::null())
146 .stderr(Stdio::null())
147 .status();
148
149 cargo(project)
150 .arg(if project.has_pass { "build" } else { "check" })
151 .args(target())
152 .arg("--bins")
153 .args(features(project))
154 .arg("--quiet")
155 .arg("--color=never")
156 .arg("--message-format=json")
157 .arg("--keep-going")
158 .output()
159 .map_err(Error::Cargo)
160}
161
162pub fn run_test(project: &Project, name: &Name) -> Result<Output> {
163 cargo(project)
164 .arg("run")
165 .args(target())
166 .arg("--bin")
167 .arg(name)
168 .args(features(project))
169 .arg("--quiet")
170 .arg("--color=never")
171 .output()
172 .map_err(Error::Cargo)
173}
174
175pub fn metadata() -> Result<Metadata> {
176 let output = raw_cargo()
177 .arg("metadata")
178 .arg("--no-deps")
179 .arg("--format-version=1")
180 .output()
181 .map_err(Error::Cargo)?;
182
183 serde_json::from_slice(&output.stdout).map_err(|err| {
184 {
use std::io::Write;
let _ =
crate::term::lock().write_fmt(format_args!("{0}",
String::from_utf8_lossy(&output.stderr)));
};print!("{}", String::from_utf8_lossy(&output.stderr));
185 Error::Metadata(err)
186 })
187}
188
189fn features(project: &Project) -> Vec<String> {
190 match &project.features {
191 Some(features) => <[_]>::into_vec(::alloc::boxed::box_new(["--no-default-features".to_owned(),
"--features".to_owned(), features.join(",")]))vec![
192 "--no-default-features".to_owned(),
193 "--features".to_owned(),
194 features.join(","),
195 ],
196 None => ::alloc::vec::Vec::new()vec![],
197 }
198}
199
200fn target() -> Vec<&'static str> {
201 if falsecfg!(trybuild_no_target) {
215 ::alloc::vec::Vec::new()vec![]
216 } else {
217 <[_]>::into_vec(::alloc::boxed::box_new(["--target", TARGET]))vec!["--target", TARGET]
218 }
219}