pub struct CacheKey {
pub source_hash: [u8; 32],
pub context_hash: [u8; 32],
pub harn_version: Cow<'static, str>,
pub compiler_tag: u8,
pub provenance: ModuleProvenance,
}Expand description
Cache key components for a single pipeline source. Equality of all fields is necessary and sufficient for cache reuse.
Fields§
§source_hash: [u8; 32]§context_hash: [u8; 32]§harn_version: Cow<'static, str>Harn version stamped into, and required by, this artifact’s header.
Normally the running binary’s own HARN_VERSION. Release preparation
bumps Cargo.toml after snapshotting the generator, so that one
caller must stamp the version the shipped binary will report instead of
the version the generator was built at — otherwise the shipped runtime
rejects its own embedded payload and silently falls back to source
compilation. Use CacheKey::for_artifact_version.
compiler_tag: u8Compact tag for active CompilerOptions. Flipping
HARN_DISABLE_OPTIMIZATIONS between runs would otherwise reuse a
chunk compiled under the wrong setting.
provenance: ModuleProvenanceThe authority the artifact was compiled under.
Part of the identity because it selects what the emitted bytecode is
permitted to do: the same source compiled as
ModuleProvenance::TrustedHostDispatch may call privileged builtins
that the same source compiled as ModuleProvenance::User may not.
Two compiles that differ in that are not one artifact, and compiler_tag
cannot express the difference — it folds only the optimization and
legacy-ambient bits, never privileged_wire_authority. Without this
field they collide on one key and one filename.
Implementations§
Source§impl CacheKey
impl CacheKey
Sourcepub fn from_source(source_path: &Path, source: &str) -> Self
pub fn from_source(source_path: &Path, source: &str) -> Self
Compute the cache key for a .harn source file plus its transitive
user imports. source is the entry-file contents; the import
graph is walked from disk relative to source_path.
Sourcepub fn from_relocatable_source(source_path: &Path, source: &str) -> Self
pub fn from_relocatable_source(source_path: &Path, source: &str) -> Self
Compute a relocatable entry-chunk key for a closed source tree.
Unlike Self::from_source, the dependency graph identifies files by
their path relative to the entrypoint directory. Moving the complete
tree therefore preserves the key, while changing a relative path,
source byte, compiler build, or embedded stdlib still invalidates it.
This is the key used by packaged adjacent artifacts; ordinary shared
cache entries remain anchored to canonical host paths.
Sourcepub fn for_artifact_version(self, harn_version: impl Into<String>) -> Self
pub fn for_artifact_version(self, harn_version: impl Into<String>) -> Self
Restamp this key for an artifact that a different Harn version will load. Only release preparation needs this; every ordinary compile and lookup keeps the running binary’s own version.
Sourcepub fn from_module_source(
source: &ModuleSource,
compilation_context: &ModuleCompilationContext,
provenance: ModuleProvenance,
) -> Self
pub fn from_module_source( source: &ModuleSource, compilation_context: &ModuleCompilationContext, provenance: ModuleProvenance, ) -> Self
Compute the cache key for one independently-compiled module artifact.
A ModuleArtifact stores unresolved import specs and never compiles
dependency bodies into the parent artifact. Its lowering can still
depend on the imported interface supplied explicitly here; every
dependency body remains protected by its own source-local key.
Diagnostic paths are rebound when the artifact is loaded, so adjacent
and packaged artifacts remain relocatable without aliasing attribution.
Sourcepub fn from_module_content_hash(
content_hash: [u8; 32],
compilation_context: &ModuleCompilationContext,
provenance: ModuleProvenance,
) -> Self
pub fn from_module_content_hash( content_hash: [u8; 32], compilation_context: &ModuleCompilationContext, provenance: ModuleProvenance, ) -> Self
As from_module_source, but from a digest
recorded earlier instead of bytes in hand.
The source digest and typed imported interface are the graph-local parts
of a module key. A validated GraphLinkTable carries both so it can
name an artifact without reading the file or rebuilding the graph.
Sourcepub fn from_embedded_stdlib_module_content_hash(
content_hash: [u8; 32],
provenance: ModuleProvenance,
) -> Self
pub fn from_embedded_stdlib_module_content_hash( content_hash: [u8; 32], provenance: ModuleProvenance, ) -> Self
Identity for an embedded stdlib module artifact, derived without parsing the module.
Every input to a stdlib module’s imported interface is already part of
this key: its own bytes as content_hash, and the rest of the closure
it can import as the embedded stdlib table, whose
[embedded_stdlib_digest] every module key’s context hash folds in. The
interface digest adds no discriminating power here, while deriving it
costs a full lex and parse in front of the lookup that exists to avoid
one. User files keep the real digest: their dependencies are mutable
files no other field of the key can see, which is the aliasing that
field was added to prevent.
Sourcepub fn filename(&self) -> String
pub fn filename(&self) -> String
Entry-chunk filename for this key. We hash by source content alone so two invocations of the same source from different paths share a cache entry; the header’s compilation-context hash still gates reuse on a per-load basis.
Sourcepub fn module_filename(&self) -> String
pub fn module_filename(&self) -> String
Module-artifact filename for this complete compilation key. Diagnostic source paths are rebound at load time, so identical source and compiler inputs share one relocatable artifact across paths.
Trait Implementations§
impl Eq for CacheKey
impl StructuralPartialEq for CacheKey
Auto Trait Implementations§
impl Freeze for CacheKey
impl RefUnwindSafe for CacheKey
impl Send for CacheKey
impl Sync for CacheKey
impl Unpin for CacheKey
impl UnsafeUnpin for CacheKey
impl UnwindSafe for CacheKey
Blanket Implementations§
Source§impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
Source§impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
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
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
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 moreSource§impl<T> Paint for Twhere
T: ?Sized,
impl<T> Paint for Twhere
T: ?Sized,
Source§fn fg(&self, value: Color) -> Painted<&T>
fn fg(&self, value: Color) -> Painted<&T>
Returns a styled value derived from self with the foreground set to
value.
This method should be used rarely. Instead, prefer to use color-specific
builder methods like red() and
green(), which have the same functionality but are
pithier.
§Example
Set foreground color to white using fg():
use yansi::{Paint, Color};
painted.fg(Color::White);Set foreground color to white using white().
use yansi::Paint;
painted.white();Source§fn bright_black(&self) -> Painted<&T>
fn bright_black(&self) -> Painted<&T>
Source§fn bright_red(&self) -> Painted<&T>
fn bright_red(&self) -> Painted<&T>
Source§fn bright_green(&self) -> Painted<&T>
fn bright_green(&self) -> Painted<&T>
Source§fn bright_yellow(&self) -> Painted<&T>
fn bright_yellow(&self) -> Painted<&T>
Source§fn bright_blue(&self) -> Painted<&T>
fn bright_blue(&self) -> Painted<&T>
Source§fn bright_magenta(&self) -> Painted<&T>
fn bright_magenta(&self) -> Painted<&T>
Source§fn bright_cyan(&self) -> Painted<&T>
fn bright_cyan(&self) -> Painted<&T>
Source§fn bright_white(&self) -> Painted<&T>
fn bright_white(&self) -> Painted<&T>
Source§fn bg(&self, value: Color) -> Painted<&T>
fn bg(&self, value: Color) -> Painted<&T>
Returns a styled value derived from self with the background set to
value.
This method should be used rarely. Instead, prefer to use color-specific
builder methods like on_red() and
on_green(), which have the same functionality but
are pithier.
§Example
Set background color to red using fg():
use yansi::{Paint, Color};
painted.bg(Color::Red);Set background color to red using on_red().
use yansi::Paint;
painted.on_red();Source§fn on_primary(&self) -> Painted<&T>
fn on_primary(&self) -> Painted<&T>
Source§fn on_magenta(&self) -> Painted<&T>
fn on_magenta(&self) -> Painted<&T>
Source§fn on_bright_black(&self) -> Painted<&T>
fn on_bright_black(&self) -> Painted<&T>
Source§fn on_bright_red(&self) -> Painted<&T>
fn on_bright_red(&self) -> Painted<&T>
Source§fn on_bright_green(&self) -> Painted<&T>
fn on_bright_green(&self) -> Painted<&T>
Source§fn on_bright_yellow(&self) -> Painted<&T>
fn on_bright_yellow(&self) -> Painted<&T>
Source§fn on_bright_blue(&self) -> Painted<&T>
fn on_bright_blue(&self) -> Painted<&T>
Source§fn on_bright_magenta(&self) -> Painted<&T>
fn on_bright_magenta(&self) -> Painted<&T>
Source§fn on_bright_cyan(&self) -> Painted<&T>
fn on_bright_cyan(&self) -> Painted<&T>
Source§fn on_bright_white(&self) -> Painted<&T>
fn on_bright_white(&self) -> Painted<&T>
Source§fn attr(&self, value: Attribute) -> Painted<&T>
fn attr(&self, value: Attribute) -> Painted<&T>
Enables the styling Attribute value.
This method should be used rarely. Instead, prefer to use
attribute-specific builder methods like bold() and
underline(), which have the same functionality
but are pithier.
§Example
Make text bold using attr():
use yansi::{Paint, Attribute};
painted.attr(Attribute::Bold);Make text bold using using bold().
use yansi::Paint;
painted.bold();Source§fn rapid_blink(&self) -> Painted<&T>
fn rapid_blink(&self) -> Painted<&T>
Source§fn quirk(&self, value: Quirk) -> Painted<&T>
fn quirk(&self, value: Quirk) -> Painted<&T>
Enables the yansi Quirk value.
This method should be used rarely. Instead, prefer to use quirk-specific
builder methods like mask() and
wrap(), which have the same functionality but are
pithier.
§Example
Enable wrapping using .quirk():
use yansi::{Paint, Quirk};
painted.quirk(Quirk::Wrap);Enable wrapping using wrap().
use yansi::Paint;
painted.wrap();Source§fn clear(&self) -> Painted<&T>
👎Deprecated since 1.0.1: renamed to resetting() due to conflicts with Vec::clear().
The clear() method will be removed in a future release.
fn clear(&self) -> Painted<&T>
renamed to resetting() due to conflicts with Vec::clear().
The clear() method will be removed in a future release.
Source§fn whenever(&self, value: Condition) -> Painted<&T>
fn whenever(&self, value: Condition) -> Painted<&T>
Conditionally enable styling based on whether the Condition value
applies. Replaces any previous condition.
See the crate level docs for more details.
§Example
Enable styling painted only when both stdout and stderr are TTYs:
use yansi::{Paint, Condition};
painted.red().on_yellow().whenever(Condition::STDOUTERR_ARE_TTY);