pub struct EvalContext { /* private fields */ }Expand description
Evaluation context for a REPL session
Manages session state, execution tiers, and caching.
§Architecture
Uses Arc<Mutex<>> for components that need shared mutable state:
- ArtifactCache: Shared persistent cache across clones
- CachedCompiler: Shared compilation state
- SubprocessExecutor: Single subprocess per session (not cloned)
- SessionDir: Shared session directory
Implementations§
Source§impl EvalContext
impl EvalContext
Sourcepub fn new(session_id: SessionId, mode: ReplMode) -> Self
pub fn new(session_id: SessionId, mode: ReplMode) -> Self
Create a new evaluation context
§Examples
use oxur_repl::eval::EvalContext;
use oxur_repl::protocol::{ReplMode, SessionId};
let ctx = EvalContext::new(SessionId::new("session-1"), ReplMode::Lisp);Sourcepub fn with_compilation(session_id: SessionId, mode: ReplMode) -> Result<Self>
pub fn with_compilation(session_id: SessionId, mode: ReplMode) -> Result<Self>
Create a new evaluation context with full compilation pipeline
Initializes all Tier 2/3 components for actual compilation and execution.
§Errors
Returns error if:
- Session directory cannot be created
- Artifact cache cannot be initialized
- Subprocess cannot be spawned
Sourcepub fn session_id(&self) -> &SessionId
pub fn session_id(&self) -> &SessionId
Get the session ID
Sourcepub fn stats(&self) -> (u64, u64, u64)
pub fn stats(&self) -> (u64, u64, u64)
Get execution statistics (legacy method for backward compatibility)
Returns (tier1_count, tier2_count, cache_hits) Note: tier2_count includes both CachedLoaded and JustInTime tiers for backward compatibility
Sourcepub fn stats_collector(&self) -> Arc<Mutex<EvalMetrics>>
pub fn stats_collector(&self) -> Arc<Mutex<EvalMetrics>>
Get the statistics collector
Returns a shared reference to the stats collector for detailed metrics access.
Sourcepub fn usage_metrics(&self) -> Arc<Mutex<UsageMetrics>>
pub fn usage_metrics(&self) -> Arc<Mutex<UsageMetrics>>
Get the usage metrics collector
Returns a shared reference to the usage metrics collector for command frequency tracking.
Sourcepub fn clone_to(&self, new_session_id: SessionId) -> Self
pub fn clone_to(&self, new_session_id: SessionId) -> Self
Clone this context into a new session
Creates a new context with a different session ID but the same cache and state. Resets execution statistics.
Note: Shared components (Arc<Mutex<>>) are cloned (reference counted), so they share state across clones.
Sourcepub async fn eval(&mut self, code: impl AsRef<str>) -> Result<EvalResult>
pub async fn eval(&mut self, code: impl AsRef<str>) -> Result<EvalResult>
Evaluate code in this context
Uses tiered execution strategy:
- Tier 1 (Calculator): Simple arithmetic literals only
- Tier 2 (Cached Compilation): Everything else
- Hybrid: Calculator variables accessible in compiled code
§Errors
Returns EvalError if evaluation fails due to:
SyntaxError: Invalid syntax in the input codeTypeError: Type mismatch or invalid type operationsRuntimeError: Runtime errors during executionCompilationError: Failed to compile to executable codeUnsupportedOperation: Operation not supported in current tier
Sourcepub fn clear_cache(&mut self)
pub fn clear_cache(&mut self)
Clear the compilation cache
Sourcepub fn cache_size(&self) -> usize
pub fn cache_size(&self) -> usize
Get cache size
Sourcepub fn session_dir_stats(&self) -> Option<DirStats>
pub fn session_dir_stats(&self) -> Option<DirStats>
Get session directory statistics
Returns information about files and disk usage in the session’s temporary directory. Returns None if the session directory is not initialized.
Sourcepub fn artifact_cache_stats(&self) -> Option<CacheStats>
pub fn artifact_cache_stats(&self) -> Option<CacheStats>
Get artifact cache statistics
Returns detailed statistics about the global artifact cache including entry count, total size, and oldest/newest entries. Returns None if artifact cache is not initialized.
Sourcepub fn subprocess_stats(&self) -> Option<SubprocessMetricsSnapshot>
pub fn subprocess_stats(&self) -> Option<SubprocessMetricsSnapshot>
Get subprocess metrics snapshot.
Returns metrics about the subprocess executor including restart count, uptime, and last restart reason.
Sourcepub fn infer_types(&self, code: impl AsRef<str>) -> Vec<(String, String, bool)>
pub fn infer_types(&self, code: impl AsRef<str>) -> Vec<(String, String, bool)>
Infer types from Rust code
Parses the provided Rust code and extracts type information for
all variable declarations. This can be used to implement the :type
REPL command.
§Arguments
code- Rust source code to analyze
§Returns
Vector of (variable_name, type_info) pairs
§Examples
use oxur_repl::eval::EvalContext;
use oxur_repl::protocol::{ReplMode, SessionId};
let ctx = EvalContext::new(SessionId::new("test"), ReplMode::Lisp);
let code = r#"
fn main() {
let x: i32 = 42;
let y = "hello";
}
"#;
let types = ctx.infer_types(code);
assert_eq!(types.len(), 2);Sourcepub fn register_variable_type(
&mut self,
name: impl Into<String>,
type_name: impl Into<String>,
is_mutable: bool,
)
pub fn register_variable_type( &mut self, name: impl Into<String>, type_name: impl Into<String>, is_mutable: bool, )
Register a variable’s type information
Manually register type information for a variable. This is useful for tracking types across REPL evaluations.
§Arguments
name- Variable nametype_name- Type as a string (e.g., “i32”, “String”)is_mutable- Whether the variable is mutable
§Examples
use oxur_repl::eval::EvalContext;
use oxur_repl::protocol::{ReplMode, SessionId};
let mut ctx = EvalContext::new(SessionId::new("test"), ReplMode::Lisp);
ctx.register_variable_type("x", "i32", false);
let type_name = ctx.get_variable_type("x");
assert_eq!(type_name, Some("i32".to_string()));Sourcepub fn get_variable_type(&self, name: impl AsRef<str>) -> Option<String>
pub fn get_variable_type(&self, name: impl AsRef<str>) -> Option<String>
Get the type of a variable
Returns the type name for a previously registered variable.
§Arguments
name- Variable name
§Returns
Some(type_name) if variable is tracked, None otherwise
§Examples
use oxur_repl::eval::EvalContext;
use oxur_repl::protocol::{ReplMode, SessionId};
let mut ctx = EvalContext::new(SessionId::new("test"), ReplMode::Lisp);
ctx.register_variable_type("x", "i32", false);
assert_eq!(ctx.get_variable_type("x"), Some("i32".to_string()));
assert_eq!(ctx.get_variable_type("y"), None);Sourcepub fn get_all_variable_types(&self) -> Vec<(String, String, bool)>
pub fn get_all_variable_types(&self) -> Vec<(String, String, bool)>
Get all tracked variables with their types
Returns a list of all variables currently tracked by the type inference engine along with their type information.
§Returns
Vector of (variable_name, type_name, is_mutable) tuples
§Examples
use oxur_repl::eval::EvalContext;
use oxur_repl::protocol::{ReplMode, SessionId};
let mut ctx = EvalContext::new(SessionId::new("test"), ReplMode::Lisp);
ctx.register_variable_type("x", "i32", false);
ctx.register_variable_type("y", "String", true);
let vars = ctx.get_all_variable_types();
assert_eq!(vars.len(), 2);Sourcepub fn clear_type_information(&mut self)
pub fn clear_type_information(&mut self)
Clear all tracked type information
Removes all tracked variable types from the type inference engine. Useful when starting a new REPL session or resetting state.
§Examples
use oxur_repl::eval::EvalContext;
use oxur_repl::protocol::{ReplMode, SessionId};
let mut ctx = EvalContext::new(SessionId::new("test"), ReplMode::Lisp);
ctx.register_variable_type("x", "i32", false);
assert_eq!(ctx.get_all_variable_types().len(), 1);
ctx.clear_type_information();
assert_eq!(ctx.get_all_variable_types().len(), 0);Trait Implementations§
Source§impl Clone for EvalContext
impl Clone for EvalContext
Source§fn clone(&self) -> EvalContext
fn clone(&self) -> EvalContext
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreAuto Trait Implementations§
impl Freeze for EvalContext
impl RefUnwindSafe for EvalContext
impl Send for EvalContext
impl Sync for EvalContext
impl Unpin for EvalContext
impl UnwindSafe for EvalContext
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 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>
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);