hakari

Struct HakariBuilder

source
pub struct HakariBuilder<'g> { /* private fields */ }
Expand description

Configures and constructs Hakari instances.

This struct provides a number of options that determine how Hakari instances are generated.

Implementations§

source§

impl<'g> HakariBuilder<'g>

source

pub fn manage_dep_ops( &self, workspace_set: &PackageSet<'g>, ) -> Option<WorkspaceOps<'g, '_>>

Returns the set of operations that need to be performed to add the workspace-hack dependency to the given set of workspace crates.

Also includes remove operations for the workspace-hack dependency from excluded crates.

Returns None if the hakari package wasn’t specified at construction time.

Requires the cli-support feature to be enabled.

source

pub fn add_dep_ops( &self, workspace_set: &PackageSet<'g>, force: bool, ) -> Option<WorkspaceOps<'g, '_>>

Returns the set of operations that need to be performed to add the workspace-hack dependency to the given set of workspace crates.

Returns None if the hakari package wasn’t specified at construction time.

Requires the cli-support feature to be enabled.

source

pub fn remove_dep_ops( &self, workspace_set: &PackageSet<'g>, force: bool, ) -> Option<WorkspaceOps<'g, '_>>

Returns the set of operations that need to be performed to remove the workspace-hack dependency from the given set of workspace crates.

Returns None if the hakari package wasn’t specified at construction time.

Requires the cli-support feature to be enabled.

source§

impl<'g> HakariBuilder<'g>

source

pub fn from_summary( graph: &'g PackageGraph, summary: &HakariBuilderSummary, ) -> Result<Self, Error>

Constructs a HakariBuilder from a PackageGraph and a serialized summary.

Requires the cli-support feature to be enabled.

Returns an error if the summary references a package that’s not present, or if there was some other issue while creating a HakariBuilder from the summary.

source§

impl<'g> HakariBuilder<'g>

source

pub fn new( graph: &'g PackageGraph, hakari_id: Option<&PackageId>, ) -> Result<Self, Error>

Creates a new HakariBuilder instance from a PackageGraph.

The Hakari package itself is usually present in the workspace. If so, specify its package ID, otherwise pass in None.

Returns an error if a Hakari package ID is specified but it isn’t known to the graph, or isn’t in the workspace.

source

pub fn graph(&self) -> &'g PackageGraph

Returns the PackageGraph used to construct this Hakari instance.

source

pub fn hakari_package(&self) -> Option<&PackageMetadata<'g>>

Returns the Hakari package, or None if it wasn’t passed into new.

source

pub fn read_toml(&self) -> Option<Result<HakariCargoToml, CargoTomlError>>

Reads the existing TOML file for the Hakari package from disk, returning a HakariCargoToml.

This can be used with Hakari::to_toml_string to manage the contents of the Hakari package’s TOML file on disk.

Returns an error if there was an issue reading the TOML file from disk, or None if this builder was created without a Hakari package.

source

pub fn set_platforms( &mut self, platforms: impl IntoIterator<Item = impl Into<Cow<'static, str>>>, ) -> Result<&mut Self, TargetSpecError>

Sets a list of platforms for hakari to use.

By default, hakari unifies features that are always enabled across all platforms. If builds are commonly performed on a few platforms, hakari can output platform-specific instructions for those builds.

This currently supports target triples only, without further customization around target features or flags. In the future, this may support cfg() expressions using an SMT solver.

Call set_platforms with an empty list to reset to default behavior.

Returns an error if a platform wasn’t known to target_spec, the library hakari uses to resolve platforms.

source

pub fn platforms(&self) -> impl ExactSizeIterator<Item = &str> + '_

Returns the platforms set through set_platforms, or an empty list if no platforms are set.

source

pub fn set_resolver(&mut self, resolver: CargoResolverVersion) -> &mut Self

Sets the Cargo resolver version.

By default, HakariBuilder uses version 2 of the Cargo resolver. For more about Cargo resolvers, see the documentation for CargoResolverVersion.

source

pub fn resolver(&self) -> CargoResolverVersion

Returns the current Cargo resolver version.

source

pub fn add_traversal_excludes<'b>( &mut self, excludes: impl IntoIterator<Item = &'b PackageId>, ) -> Result<&mut Self, Error>

Pretends that the provided packages don’t exist during graph traversals.

Users may wish to not consider certain packages while figuring out the unified feature set. Setting this option prevents those packages from being considered.

Practically, this means that:

  • If a workspace package is specified, Cargo build simulations for it will not be run.
  • If a third-party package is specified, it will not be present in the output, nor will any transitive dependencies or features enabled by it that aren’t enabled any other way. In other words, any packages excluded during traversal are also excluded from the final output.

Returns an error if any package IDs specified aren’t known to the graph.

source

pub fn traversal_excludes<'b>( &'b self, ) -> impl Iterator<Item = &'g PackageId> + 'b

Returns the packages currently excluded during graph traversals.

Also returns the Hakari package if specified. This is because the Hakari package is treated as excluded while performing unification.

source

pub fn is_traversal_excluded( &self, package_id: &PackageId, ) -> Result<bool, Error>

Returns true if a package ID is currently excluded during traversal.

Also returns true for the Hakari package if specified. This is because the Hakari package is treated as excluded by the algorithm.

Returns an error if this package ID isn’t known to the underlying graph.

source

pub fn add_final_excludes<'b>( &mut self, excludes: impl IntoIterator<Item = &'b PackageId>, ) -> Result<&mut Self, Error>

Adds packages to be removed from the final output.

Unlike traversal_excludes, these packages are considered during traversals, but removed at the end.

Returns an error if any package IDs specified aren’t known to the graph.

source

pub fn final_excludes<'b>(&'b self) -> impl Iterator<Item = &'g PackageId> + 'b

Returns the packages to be removed from the final output.

source

pub fn is_final_excluded(&self, package_id: &PackageId) -> Result<bool, Error>

Returns true if a package ID is currently excluded from the final output.

Returns an error if this package ID isn’t known to the underlying graph.

source

pub fn is_excluded(&self, package_id: &PackageId) -> Result<bool, Error>

Returns true if a package ID is excluded from either the traversal or the final output.

Also returns true for the Hakari package if specified. This is because the Hakari package is treated as excluded by the algorithm.

Returns an error if this package ID isn’t known to the underlying graph.

source

pub fn add_registries( &mut self, registries: impl IntoIterator<Item = (impl Into<String>, impl Into<String>)>, ) -> &mut Self

Add alternate registries by (name, URL) pairs.

This is a temporary workaround until Cargo issue #9052 is resolved.

source

pub fn set_unify_target_host( &mut self, unify_target_host: UnifyTargetHost, ) -> &mut Self

Whether and how to unify feature sets across target and host platforms.

This is an advanced feature that most users don’t need to set. For more information about this option, see the documentation for UnifyTargetHost.

source

pub fn unify_target_host(&self) -> UnifyTargetHost

Returns the current value of unify_target_host.

source

pub fn set_output_single_feature( &mut self, output_single_feature: bool, ) -> &mut Self

Whether to unify feature sets for all dependencies.

By default, Hakari only produces output for dependencies that are built with more than one feature set. If set to true, Hakari will produce outputs for all dependencies, including those that don’t need to be unified.

This is rarely needed in production, and is most useful for testing and debugging scenarios.

source

pub fn output_single_feature(&self) -> bool

Returns the current value of output_single_feature.

source

pub fn set_dep_format_version( &mut self, dep_format_version: DepFormatVersion, ) -> &mut Self

Version of hakari data to output.

For more, see the documentation for DepFormatVersion.

source

pub fn dep_format_version(&self) -> DepFormatVersion

Returns the current value of dep_format_version.

source

pub fn set_workspace_hack_line_style( &mut self, line_style: WorkspaceHackLineStyle, ) -> &mut Self

Kind of workspace-hack = ... lines to output.

For more, see the documentation for WorkspaceHackLineStyle.

source

pub fn workspace_hack_line_style(&self) -> WorkspaceHackLineStyle

Returns the current value of workspace_hack_line_style.

source

pub fn compute(self) -> Hakari<'g>

Computes the Hakari for this builder.

source§

impl<'g> HakariBuilder<'g>

§Helpers for property testing

The methods in this section allow random instances of a HakariBuilder to be generated, for use in property-based testing scenarios.

Requires the proptest1 feature to be enabled.

source

pub fn proptest1_strategy( graph: &'g PackageGraph, hakari_id_strategy: impl Strategy<Value = Option<&'g PackageId>> + 'g, ) -> impl Strategy<Value = HakariBuilder<'g>> + 'g

Returns a Strategy that generates random HakariBuilder instances based on this graph.

Requires the proptest1 feature to be enabled.

§Panics

Panics if:

  • there are no packages in this PackageGraph, or
  • hakari_id is specified but it isn’t known to the graph, or isn’t in the workspace.
source§

impl<'g> HakariBuilder<'g>

source

pub fn to_summary(&self) -> Result<HakariBuilderSummary, TargetSpecError>

Converts this HakariBuilder to a serializable summary.

Requires the cli-support feature to be enabled.

Returns an error if there are any custom platforms. Serializing custom platforms is currently unsupported.

source§

impl<'g> HakariBuilder<'g>

source

pub fn verify(self) -> Result<(), VerifyErrors<'g>>

Verify that hakari worked properly.

Returns Ok(()) if only one version of every third-party dependency was built, or a list of errors if at least one third-party dependency had more than one version built.

For more about how this works, see the documentation for the verify module.

Trait Implementations§

source§

impl<'g> Clone for HakariBuilder<'g>

source§

fn clone(&self) -> HakariBuilder<'g>

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl<'g> Debug for HakariBuilder<'g>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

§

impl<'g> Freeze for HakariBuilder<'g>

§

impl<'g> RefUnwindSafe for HakariBuilder<'g>

§

impl<'g> Send for HakariBuilder<'g>

§

impl<'g> Sync for HakariBuilder<'g>

§

impl<'g> Unpin for HakariBuilder<'g>

§

impl<'g> UnwindSafe for HakariBuilder<'g>

Blanket Implementations§

source§

impl<T> Any for T
where T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where T: Clone,

source§

unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T, U> Into<U> for T
where U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

source§

impl<T> IntoEither for T

source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts 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 more
source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts 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
source§

impl<D> OwoColorize for D

source§

fn fg<C>(&self) -> FgColorDisplay<'_, C, Self>
where C: Color,

Set the foreground color generically Read more
source§

fn bg<C>(&self) -> BgColorDisplay<'_, C, Self>
where C: Color,

Set the background color generically. Read more
source§

fn black<'a>(&'a self) -> FgColorDisplay<'a, Black, Self>

Change the foreground color to black
source§

fn on_black<'a>(&'a self) -> BgColorDisplay<'a, Black, Self>

Change the background color to black
source§

fn red<'a>(&'a self) -> FgColorDisplay<'a, Red, Self>

Change the foreground color to red
source§

fn on_red<'a>(&'a self) -> BgColorDisplay<'a, Red, Self>

Change the background color to red
source§

fn green<'a>(&'a self) -> FgColorDisplay<'a, Green, Self>

Change the foreground color to green
source§

fn on_green<'a>(&'a self) -> BgColorDisplay<'a, Green, Self>

Change the background color to green
source§

fn yellow<'a>(&'a self) -> FgColorDisplay<'a, Yellow, Self>

Change the foreground color to yellow
source§

fn on_yellow<'a>(&'a self) -> BgColorDisplay<'a, Yellow, Self>

Change the background color to yellow
source§

fn blue<'a>(&'a self) -> FgColorDisplay<'a, Blue, Self>

Change the foreground color to blue
source§

fn on_blue<'a>(&'a self) -> BgColorDisplay<'a, Blue, Self>

Change the background color to blue
source§

fn magenta<'a>(&'a self) -> FgColorDisplay<'a, Magenta, Self>

Change the foreground color to magenta
source§

fn on_magenta<'a>(&'a self) -> BgColorDisplay<'a, Magenta, Self>

Change the background color to magenta
source§

fn purple<'a>(&'a self) -> FgColorDisplay<'a, Magenta, Self>

Change the foreground color to purple
source§

fn on_purple<'a>(&'a self) -> BgColorDisplay<'a, Magenta, Self>

Change the background color to purple
source§

fn cyan<'a>(&'a self) -> FgColorDisplay<'a, Cyan, Self>

Change the foreground color to cyan
source§

fn on_cyan<'a>(&'a self) -> BgColorDisplay<'a, Cyan, Self>

Change the background color to cyan
source§

fn white<'a>(&'a self) -> FgColorDisplay<'a, White, Self>

Change the foreground color to white
source§

fn on_white<'a>(&'a self) -> BgColorDisplay<'a, White, Self>

Change the background color to white
source§

fn default_color<'a>(&'a self) -> FgColorDisplay<'a, Default, Self>

Change the foreground color to the terminal default
source§

fn on_default_color<'a>(&'a self) -> BgColorDisplay<'a, Default, Self>

Change the background color to the terminal default
source§

fn bright_black<'a>(&'a self) -> FgColorDisplay<'a, BrightBlack, Self>

Change the foreground color to bright black
source§

fn on_bright_black<'a>(&'a self) -> BgColorDisplay<'a, BrightBlack, Self>

Change the background color to bright black
source§

fn bright_red<'a>(&'a self) -> FgColorDisplay<'a, BrightRed, Self>

Change the foreground color to bright red
source§

fn on_bright_red<'a>(&'a self) -> BgColorDisplay<'a, BrightRed, Self>

Change the background color to bright red
source§

fn bright_green<'a>(&'a self) -> FgColorDisplay<'a, BrightGreen, Self>

Change the foreground color to bright green
source§

fn on_bright_green<'a>(&'a self) -> BgColorDisplay<'a, BrightGreen, Self>

Change the background color to bright green
source§

fn bright_yellow<'a>(&'a self) -> FgColorDisplay<'a, BrightYellow, Self>

Change the foreground color to bright yellow
source§

fn on_bright_yellow<'a>(&'a self) -> BgColorDisplay<'a, BrightYellow, Self>

Change the background color to bright yellow
source§

fn bright_blue<'a>(&'a self) -> FgColorDisplay<'a, BrightBlue, Self>

Change the foreground color to bright blue
source§

fn on_bright_blue<'a>(&'a self) -> BgColorDisplay<'a, BrightBlue, Self>

Change the background color to bright blue
source§

fn bright_magenta<'a>(&'a self) -> FgColorDisplay<'a, BrightMagenta, Self>

Change the foreground color to bright magenta
source§

fn on_bright_magenta<'a>(&'a self) -> BgColorDisplay<'a, BrightMagenta, Self>

Change the background color to bright magenta
source§

fn bright_purple<'a>(&'a self) -> FgColorDisplay<'a, BrightMagenta, Self>

Change the foreground color to bright purple
source§

fn on_bright_purple<'a>(&'a self) -> BgColorDisplay<'a, BrightMagenta, Self>

Change the background color to bright purple
source§

fn bright_cyan<'a>(&'a self) -> FgColorDisplay<'a, BrightCyan, Self>

Change the foreground color to bright cyan
source§

fn on_bright_cyan<'a>(&'a self) -> BgColorDisplay<'a, BrightCyan, Self>

Change the background color to bright cyan
source§

fn bright_white<'a>(&'a self) -> FgColorDisplay<'a, BrightWhite, Self>

Change the foreground color to bright white
source§

fn on_bright_white<'a>(&'a self) -> BgColorDisplay<'a, BrightWhite, Self>

Change the background color to bright white
source§

fn bold<'a>(&'a self) -> BoldDisplay<'a, Self>

Make the text bold
source§

fn dimmed<'a>(&'a self) -> DimDisplay<'a, Self>

Make the text dim
source§

fn italic<'a>(&'a self) -> ItalicDisplay<'a, Self>

Make the text italicized
source§

fn underline<'a>(&'a self) -> UnderlineDisplay<'a, Self>

Make the text italicized
Make the text blink
Make the text blink (but fast!)
source§

fn reversed<'a>(&'a self) -> ReversedDisplay<'a, Self>

Swap the foreground and background colors
source§

fn hidden<'a>(&'a self) -> HiddenDisplay<'a, Self>

Hide the text
source§

fn strikethrough<'a>(&'a self) -> StrikeThroughDisplay<'a, Self>

Cross out the text
source§

fn color<Color>(&self, color: Color) -> FgDynColorDisplay<'_, Color, Self>
where Color: DynColor,

Set the foreground color at runtime. Only use if you do not know which color will be used at compile-time. If the color is constant, use either OwoColorize::fg or a color-specific method, such as OwoColorize::green, Read more
source§

fn on_color<Color>(&self, color: Color) -> BgDynColorDisplay<'_, Color, Self>
where Color: DynColor,

Set the background color at runtime. Only use if you do not know what color to use at compile-time. If the color is constant, use either OwoColorize::bg or a color-specific method, such as OwoColorize::on_yellow, Read more
source§

fn fg_rgb<const R: u8, const G: u8, const B: u8>( &self, ) -> FgColorDisplay<'_, CustomColor<R, G, B>, Self>

Set the foreground color to a specific RGB value.
source§

fn bg_rgb<const R: u8, const G: u8, const B: u8>( &self, ) -> BgColorDisplay<'_, CustomColor<R, G, B>, Self>

Set the background color to a specific RGB value.
source§

fn truecolor(&self, r: u8, g: u8, b: u8) -> FgDynColorDisplay<'_, Rgb, Self>

Sets the foreground color to an RGB value.
source§

fn on_truecolor(&self, r: u8, g: u8, b: u8) -> BgDynColorDisplay<'_, Rgb, Self>

Sets the background color to an RGB value.
source§

fn style(&self, style: Style) -> Styled<&Self>

Apply a runtime-determined style
source§

fn if_supports_color<'a, Out, ApplyFn>( &'a self, stream: Stream, apply: ApplyFn, ) -> SupportsColorsDisplay<'a, Self, Out, ApplyFn>
where ApplyFn: Fn(&'a Self) -> Out,

Apply a given transformation function to all formatters if the given stream supports at least basic ANSI colors, allowing you to conditionally apply given styles/colors. Read more
source§

impl<T> Pointable for T

source§

const ALIGN: usize = _

The alignment of pointer.
source§

type Init = T

The type for initializers.
source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
source§

impl<T> ToOwned for T
where T: Clone,

source§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

source§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

source§

fn vzip(self) -> V