pub struct ConditionalLink<'g> { /* private fields */ }Expand description
A feature dependency that is conditionally activated.
A ConditionalLink is typically a link across packages. For example:
[package]
name = "main"
[dependencies]
dep = { ... }
[dev-dependencies]
dev-dep = { ... }
[target.'cfg(unix)'.dependencies]
unix-dep = { ... }
[features]
feat = ["dep/feat", "dev-dep/feat", "unix-dep/feat"]In this example, there are ConditionalLinks from main/feat to dep/feat, dev-dep/feat and
unix-dep/feat. Each link is only activated if the conditions for it are met. For example,
the link to dev-dep/feat is only followed if Cargo is interested in dev-dependencies of main.
If a dependency, for example unix-dep above, is optional, an implicit feature is created in
the package main with the name unix-dep. In this case, the dependency from main/feat to
main/unix-dep is also a ConditionalLink representing the same cfg(unix) condition.
Implementations§
Source§impl<'g> ConditionalLink<'g>
impl<'g> ConditionalLink<'g>
Sourcepub fn from(&self) -> FeatureMetadata<'g>
pub fn from(&self) -> FeatureMetadata<'g>
Returns the feature which depends on the to feature.
Sourcepub fn to(&self) -> FeatureMetadata<'g>
pub fn to(&self) -> FeatureMetadata<'g>
Returns the feature which is depended on by the from feature.
Sourcepub fn endpoints(&self) -> (FeatureMetadata<'g>, FeatureMetadata<'g>)
pub fn endpoints(&self) -> (FeatureMetadata<'g>, FeatureMetadata<'g>)
Returns the endpoints as a pair of features (from, to).
Sourcepub fn normal(&self) -> PlatformStatus<'g>
pub fn normal(&self) -> PlatformStatus<'g>
Returns details about this feature dependency from the [dependencies] section.
Sourcepub fn build(&self) -> PlatformStatus<'g>
pub fn build(&self) -> PlatformStatus<'g>
Returns details about this feature dependency from the [build-dependencies] section.
Sourcepub fn dev(&self) -> PlatformStatus<'g>
pub fn dev(&self) -> PlatformStatus<'g>
Returns details about this feature dependency from the [dev-dependencies] section.
Sourcepub fn status_for_kind(&self, kind: DependencyKind) -> PlatformStatus<'g>
pub fn status_for_kind(&self, kind: DependencyKind) -> PlatformStatus<'g>
Returns details about this feature dependency from the section specified by the given dependency kind.
Sourcepub fn dev_only(&self) -> bool
pub fn dev_only(&self) -> bool
Returns true if this edge is dev-only, i.e. code from this edge will not be included in normal builds.
This is scoped to the declarations for this link. For example, a
dependency might be optional as a normal dependency but required as a
dev-dependency. In that case, the
Required version of the link is dev-only
while the Optional half is not.
Unsplit is the union of both, so it
isn’t dev-only either.
Sourcepub fn declarations(&self) -> LinkDeclarations
pub fn declarations(&self) -> LinkDeclarations
Returns the declarations of the dependency that this link’s platform statuses were derived from.
A package can declare the same dependency more than once, and some of those declarations can be optional while others are required. For example:
[dependencies]
foo = { version = "1" }
[build-dependencies]
foo = { version = "1", optional = true }
[features]
weak = ["foo?/std"]Cargo applies foo?/std to each declaration separately.
- The required normal dependency gets
stdas soon asweakis enabled. - The optional build dependency gets
stdonly ifdep:foois also activated.
To model this, FeatureQuery::resolve_with may call the visitor twice
for the link from main/weak to foo/std:
- Once with a
Requiredlink. Here,normalis always enabled andbuildis never enabled. - Once with an
Optionallink. Here,normalis never enabled andbuildis always enabled.
Both links have the same from and to; this
method is the way to tell them apart. The link is followed if the
visitor accepts either one.
If foo has no required declarations for this package, the required
link is skipped.
When each link is offered depends on the query’s direction; see
FeatureLinkVisitor::visit_link.
Outside of a resolve, the same edge is a single link.
FeatureSet::conditional_links returns it once, with
Unsplit and the union of both sets of
statuses.
For other kinds of links, the return value is fixed:
- A link from a feature with
foo/stdtofoo’sstdfeature isUnsplit, sincefoo/stdapplies to every declaration offoothat resolves to that package. - A link from a feature with
foo/stdtodep:foo, or to a feature namedfooin the same package, isOptional, since only optional declarations offooactivate these. - A link from a feature with
dep:footodep:fooisUnsplit, sincedep:fooactivates every declaration offoo. - A link from a package’s base feature into a dependency is
Required. - A link from
dep:foointofooisOptional.
Sourcepub fn package_links(
&self,
) -> impl ExactSizeIterator<Item = PackageLink<'g>> + 'g
pub fn package_links( &self, ) -> impl ExactSizeIterator<Item = PackageLink<'g>> + 'g
Returns the PackageLinks this ConditionalLink was derived from.
This is usually one link, but in some circumstances a single name can
resolve to several packages. For example, consider this Cargo.toml:
[package]
name = "main"
[dependencies]
serde = { package = "serde_core", version = "1", optional = true }
# Never enabled on any platform, but still resolved and locked.
[target.'cfg(any())'.dependencies]
serde = { version = "1", optional = true }
[features]
serde = ["dep:serde", "serde/std"]The package graph has two links out of main, main -> serde_core and
main -> serde, both with the dependency name serde. The feature
serde produces three conditional links:
main/serde -> main/dep:serde, fromdep:serde. This activates the dependency name, so this method returns bothmain -> serde_coreandmain -> serde. The link’s platform status is the union of theirs.main/serde -> serde_core/std, fromserde/std. This method returns onlymain -> serde_core.main/serde -> serde/std, also fromserde/std. This method returns onlymain -> serde.
A link that covers only some declarations (see
declarations) omits packages with none of those
declarations. For example, a link from foo/std to dep:foo covers
only optional declarations, so it omits a package that is only ever a
required dependency named foo.
The order in which links are returned is unspecified.
Trait Implementations§
Source§impl<'g> Clone for ConditionalLink<'g>
impl<'g> Clone for ConditionalLink<'g>
Source§fn clone(&self) -> ConditionalLink<'g>
fn clone(&self) -> ConditionalLink<'g>
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreimpl<'g> Copy for ConditionalLink<'g>
Auto Trait Implementations§
impl<'g> Freeze for ConditionalLink<'g>
impl<'g> RefUnwindSafe for ConditionalLink<'g>
impl<'g> Send for ConditionalLink<'g>
impl<'g> Sync for ConditionalLink<'g>
impl<'g> Unpin for ConditionalLink<'g>
impl<'g> UnsafeUnpin for ConditionalLink<'g>
impl<'g> UnwindSafe for ConditionalLink<'g>
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more