Skip to main content

LockfileGraph

Struct LockfileGraph 

Source
pub struct LockfileGraph {
Show 16 fields pub importers: BTreeMap<String, Vec<DirectDep>>, pub packages: BTreeMap<String, LockedPackage>, pub settings: LockfileSettings, pub overrides: BTreeMap<String, String>, pub package_extensions_checksum: Option<String>, pub pnpmfile_checksum: Option<String>, pub ignored_optional_dependencies: BTreeSet<String>, pub times: BTreeMap<String, String>, pub skipped_optional_dependencies: BTreeMap<String, BTreeMap<String, String>>, pub catalogs: BTreeMap<String, BTreeMap<String, CatalogEntry>>, pub bun_config_version: Option<u32>, pub patched_dependencies: BTreeMap<String, String>, pub trusted_dependencies: Vec<String>, pub runtimes: BTreeMap<String, RuntimePin>, pub extra_fields: BTreeMap<String, Value>, pub workspace_extra_fields: BTreeMap<String, BTreeMap<String, Value>>,
}
Expand description

Represents a resolved dependency graph from any lockfile format.

Fields§

§importers: BTreeMap<String, Vec<DirectDep>>

Direct dependencies of the root project (and workspace packages). Key: importer path (e.g., “.” for root), Value: list of (name, version) pairs.

§packages: BTreeMap<String, LockedPackage>

All resolved packages.

§settings: LockfileSettings

Per-graph settings that round-trip through the lockfile header (pnpm v9’s settings: block). Don’t affect graph structure; stamped into the YAML when writing and read back when parsing, so subsequent installs see the same resolution-mode state.

§overrides: BTreeMap<String, String>

Dependency overrides recorded in pnpm-lock.yaml’s top-level overrides: block. Map of raw selector key → version specifier (or npm: alias). Keys are the user’s verbatim selector strings — bare name, foo>bar, foo@<2, **/foo, or any combination. Round-tripped so subsequent installs can detect override drift on a string-compare of the key+value without re-running the resolver. The resolver parses these into override_rule::OverrideRules at the start of each resolve pass.

§package_extensions_checksum: Option<String>

pnpm’s top-level packageExtensionsChecksum: — a sha256- prefixed object-hash of the effective packageExtensions config. Lets pnpm detect that the extensions changed (and the graph must be re-resolved) without re-reading every manifest. None when there are no package extensions (pnpm omits the field). Only the pnpm reader/writer touches this; other formats leave it None. Computed via pnpm::package_extensions_checksum.

§pnpmfile_checksum: Option<String>

pnpm’s top-level pnpmfileChecksum: — a sha256- prefixed hash of the local pnpmfile contents (CRLF-normalized). Lets pnpm detect that a .pnpmfile.cjs/.mjs hook changed without re-running it. None when no local pnpmfile participates (pnpm omits the field). pnpm-only, like package_extensions_checksum. Computed via pnpm::pnpmfile_checksum.

§ignored_optional_dependencies: BTreeSet<String>

Names listed in the root manifest’s pnpm.ignoredOptionalDependencies. The resolver drops entries in this set from every optionalDependencies map before enqueueing, matching pnpm’s read-package hook. Round-tripped through pnpm-lock.yaml’s top-level ignoredOptionalDependencies: list so drift detection can notice when the user edits the field.

§times: BTreeMap<String, String>

Per-package publish timestamps, keyed by canonical name@version (no peer suffix). Round-trips through pnpm-lock.yaml’s top-level time: block so --resolution-mode=time-based can compute a publishedBy cutoff from packages already in the lockfile without re-fetching packuments.

§skipped_optional_dependencies: BTreeMap<String, BTreeMap<String, String>>

Optional dependencies the resolver intentionally skipped on the platform that wrote this lockfile (either filtered by os/cpu/libc, or named in pnpm.ignoredOptionalDependencies). Keyed by importer path, inner map is name → specifier captured from package.json at resolve time.

Drift detection uses this to distinguish “user just added a new optional dep” (which is real drift) from “this optional was already considered and consciously dropped on this platform” (which is not drift). Without it, every --frozen-lockfile install on a platform that skipped a fixture would hard-fail.

§catalogs: BTreeMap<String, BTreeMap<String, CatalogEntry>>

Resolved catalog entries, mirroring pnpm v9’s top-level catalogs: block. Outer key is the catalog name (default for the unnamed catalog: field in pnpm-workspace.yaml); inner key is the package name. Each entry pairs the original specifier from the workspace catalog with the version the resolver chose for it. Round-tripped through the lockfile so drift detection can fire when a catalog spec changes without re-resolving.

§bun_config_version: Option<u32>

bun’s top-level configVersion — a second format counter bun added alongside lockfileVersion to track its own config- schema changes. Only the bun parser/writer ever touches this; other formats leave it None. Round-tripping the parsed value keeps the writer from silently downgrading the field (e.g. from 2 back to 1) when bun bumps it in a future release.

§patched_dependencies: BTreeMap<String, String>

Top-level patchedDependencies: block mirrored by bun 1.1+ and pnpm 9+. Key: selector (lodash@4.17.21), value: relative patch file path (patches/lodash@4.17.21.patch). Round-tripped verbatim so a parse/write cycle doesn’t silently drop user patches from the lockfile.

§trusted_dependencies: Vec<String>

Top-level trustedDependencies: block (bun) — a package-name allowlist for lifecycle script execution. Preserved so re-emitting a bun.lock doesn’t strip the allowlist and cause subsequent installs to skip scripts the user explicitly approved.

Kept as a Vec (not a set) so bun’s original order round-trips byte-identically; bun emits the list in insertion order. The parser is responsible for deduping if the source lockfile carried a duplicate.

§runtimes: BTreeMap<String, RuntimePin>

Pinned runtimes (pnpm 10.14+ devEngines.runtime recording), keyed by runtime name (node). pnpm models a pinned runtime as a synthetic importer dep whose specifier/version carry a runtime: prefix plus a packages: entry keyed <name>@runtime:<version> holding a variations resolution with one downloadable artifact per platform. aube lifts that encoding into this typed map on parse and re-emits the pnpm shape on write (aube-lock.yaml and pnpm-lock.yaml share the writer). Foreign formats (npm/yarn/bun) have no runtime shape: their parsers leave this empty and their writers skip it.

§extra_fields: BTreeMap<String, Value>

Top-level lockfile fields that aren’t explicitly modeled on LockfileGraph. Populated by per-format parsers on best-effort basis so the writer can re-emit blocks a future lockfile version might add (or ones we haven’t promoted to typed fields yet) without silently stripping them on round-trip. Each parser/writer is responsible for emitting values in its format’s native serialization.

§workspace_extra_fields: BTreeMap<String, BTreeMap<String, Value>>

Per-workspace-importer extras keyed by importer path ("" for root in bun, "." for others). Stores anything in the workspace entry the typed model doesn’t capture so a parse/ write cycle doesn’t drop fields the user (or bun) wrote there.

Implementations§

Source§

impl LockfileGraph

Source

pub fn check_drift( &self, manifest: &PackageJson, workspace_overrides: &BTreeMap<String, String>, workspace_ignored_optional: &[String], workspace_catalogs: &BTreeMap<String, BTreeMap<String, String>>, ) -> DriftStatus

Compare this lockfile’s root importer against a single manifest.

Mirrors pnpm’s prefer-frozen-lockfile check: a lockfile is “fresh” iff every direct dep specifier in package.json exactly matches the specifier recorded in the lockfile (string compare, not semver). Used to decide whether to skip resolution and trust the lockfile (Fresh) or fall back to a full re-resolve (Stale { reason }).

For workspace projects, use check_drift_workspace instead — this method only inspects the root importer.

workspace_overrides is the overrides: block from pnpm-workspace.yaml (pnpm v10 moved overrides there). Pass an empty map when the project has no workspace-yaml overrides. Keys are merged on top of manifest.overrides_map() before the drift comparison, matching the resolver’s effective-override set — otherwise a lockfile written with a workspace override immediately looks stale on the next --frozen-lockfile run.

workspace_ignored_optional is the same idea for pnpm-workspace.yaml’s ignoredOptionalDependencies block: the resolver unions it with the manifest’s list, so the drift check has to see the same union or a freshly-written lockfile immediately reads as stale.

workspace_catalogs is the catalog: / catalogs: block from pnpm-workspace.yaml. pnpm resolves catalog: references in override values against this map before writing the lockfile and before comparing on re-install, so both sides of the drift check have to see the catalog-resolved form — otherwise a "lodash": "catalog:" override reads as stale against a lockfile that recorded the resolved "lodash": "4.17.21".

Lockfile formats that don’t record specifiers (npm, yarn, bun) always return Fresh since we have no way to detect drift without re-resolving.

Source

pub fn check_drift_for_kind( &self, manifest: &PackageJson, workspace_overrides: &BTreeMap<String, String>, workspace_ignored_optional: &[String], workspace_catalogs: &BTreeMap<String, BTreeMap<String, String>>, kind: LockfileKind, ) -> DriftStatus

Source

pub fn check_drift_workspace( &self, manifests: &[(String, PackageJson)], workspace_overrides: &BTreeMap<String, String>, workspace_ignored_optional: &[String], workspace_catalogs: &BTreeMap<String, BTreeMap<String, String>>, is_workspace_install: bool, ) -> DriftStatus

Workspace-aware drift check.

Each entry in manifests is (importer_path, manifest) — for example (".", root_manifest), ("packages/app", app_manifest), .... Every importer is checked against its own manifest; the first stale importer determines the result.

See check_drift for the workspace_overrides contract.

Source

pub fn check_drift_workspace_for_kind( &self, manifests: &[(String, PackageJson)], workspace_overrides: &BTreeMap<String, String>, workspace_ignored_optional: &[String], workspace_catalogs: &BTreeMap<String, BTreeMap<String, String>>, is_workspace_install: bool, kind: LockfileKind, ) -> DriftStatus

Source

pub fn check_catalogs_drift( &self, workspace_catalogs: &BTreeMap<String, BTreeMap<String, String>>, ) -> DriftStatus

Compare this lockfile’s catalog snapshot against the current pnpm-workspace.yaml catalogs.

pnpm only writes catalog entries that at least one importer references — unused entries are absent from the lockfile. So “missing from lockfile” doesn’t mean “added by the user”, it means “declared but unreferenced”, which is not drift. The transition from unused → used is caught by the importer-level drift check, since a fresh catalog: reference shows up as a new dep in some package.json.

We fire on two cases only:

  • the spec changed for an entry the lockfile already records (the entry is in use, and re-resolution must rerun);
  • the workspace removed an entry that the lockfile records (the importer using catalog: now points at nothing).

Resolved versions are deliberately not part of the comparison — the version is an output of resolution, so a stale lockfile version is what re-resolution is supposed to fix. Drift only fires on user intent (the specifier).

Source§

impl LockfileGraph

Source

pub fn root_deps(&self) -> &[DirectDep]

Get all direct dependencies of the root project.

Source

pub fn get_package(&self, dep_path: &str) -> Option<&LockedPackage>

Get a package by its dep_path key.

Source

pub fn filter_deps<F>(&self, keep: F) -> LockfileGraph
where F: Fn(&DirectDep) -> bool,

Produce a new LockfileGraph containing only the direct deps that match keep and the transitive deps reachable from them.

Used by install --prod to drop DepType::Dev roots and everything only reachable through them, and by install --no-optional for optional deps. The filter runs over every importer’s direct-dep list, so workspace projects behave correctly.

Packages that are reachable from a retained root through a transitive chain are kept even if a pruned dev dep also happened to depend on them — the check is “is this package reachable from any retained root?”, not “was this package introduced by a retained root?”.

Source

pub fn subset_to_importer<F>( &self, importer_path: &str, keep: F, ) -> Option<LockfileGraph>
where F: Fn(&DirectDep) -> bool,

Produce a new LockfileGraph rooted at the importer at importer_path, with its transitive closure preserved and every other importer dropped. The retained importer is remapped to "." because the consumer installs the result as a standalone project.

Used by aube deploy: reading the source workspace lockfile and subsetting it to the deployed package lets a frozen install in the target reproduce the workspace’s exact versions without re-resolving against the registry. keep filters the importer’s direct deps the same way filter_deps does, so --prod / --dev / --no-optional deploys drop the matching roots.

Returns None if importer_path is not present in self.importers. Graph-wide metadata (settings, overrides, times, catalogs, ignored_optional_dependencies) is copied verbatim — structural pruning, not a resolution-mode reset. Callers targeting a non-workspace install may want to clear workspace-scope fields that would otherwise trigger drift detection against a rewritten target manifest.

Source

pub fn overlay_metadata_from(&mut self, prior: &LockfileGraph)

Overlay per-package metadata fields from prior onto self for every (name, version) that survives in both graphs. Carries forward only fields the abbreviated packument (npm corgi) doesn’t ship — license, funding_url, and the bun-format configVersion — so a fresh re-resolve against the same spec set doesn’t lose them.

Keyed by canonical name@version, so a peer-context rewrite between the old and new graph still lines up. self’s own values win when set (fresh registry data is authoritative); prior’s fill in only the None / empty slots. Safe to call on any pair of graphs — parsing the old lockfile is the caller’s concern.

Trait Implementations§

Source§

impl Clone for LockfileGraph

Source§

fn clone(&self) -> LockfileGraph

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

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

Performs copy-assignment from source. Read more
Source§

impl Debug for LockfileGraph

Source§

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

Formats the value using the given formatter. Read more
Source§

impl Default for LockfileGraph

Source§

fn default() -> LockfileGraph

Returns the “default value” for a type. Read more

Auto Trait Implementations§

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, dest: *mut u8)

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

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
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(&self) -> FgColorDisplay<'_, Black, Self>

Change the foreground color to black
Source§

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

Change the background color to black
Source§

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

Change the foreground color to red
Source§

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

Change the background color to red
Source§

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

Change the foreground color to green
Source§

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

Change the background color to green
Source§

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

Change the foreground color to yellow
Source§

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

Change the background color to yellow
Source§

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

Change the foreground color to blue
Source§

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

Change the background color to blue
Source§

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

Change the foreground color to magenta
Source§

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

Change the background color to magenta
Source§

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

Change the foreground color to purple
Source§

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

Change the background color to purple
Source§

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

Change the foreground color to cyan
Source§

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

Change the background color to cyan
Source§

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

Change the foreground color to white
Source§

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

Change the background color to white
Source§

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

Change the foreground color to the terminal default
Source§

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

Change the background color to the terminal default
Source§

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

Change the foreground color to bright black
Source§

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

Change the background color to bright black
Source§

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

Change the foreground color to bright red
Source§

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

Change the background color to bright red
Source§

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

Change the foreground color to bright green
Source§

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

Change the background color to bright green
Source§

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

Change the foreground color to bright yellow
Source§

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

Change the background color to bright yellow
Source§

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

Change the foreground color to bright blue
Source§

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

Change the background color to bright blue
Source§

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

Change the foreground color to bright magenta
Source§

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

Change the background color to bright magenta
Source§

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

Change the foreground color to bright purple
Source§

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

Change the background color to bright purple
Source§

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

Change the foreground color to bright cyan
Source§

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

Change the background color to bright cyan
Source§

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

Change the foreground color to bright white
Source§

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

Change the background color to bright white
Source§

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

Make the text bold
Source§

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

Make the text dim
Source§

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

Make the text italicized
Source§

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

Make the text underlined
Make the text blink
Make the text blink (but fast!)
Source§

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

Swap the foreground and background colors
Source§

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

Hide the text
Source§

fn strikethrough(&self) -> StrikeThroughDisplay<'_, 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§

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> PolicyExt for T
where T: ?Sized,

Source§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow only if self and other return Action::Follow. Read more
Source§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow if either self or other returns Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
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<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more