Skip to main content

BudgetHandle

Struct BudgetHandle 

Source
pub struct BudgetHandle { /* private fields */ }
Expand description

Cheap, cloneable handle for budget checking from the Lua bridge.

Wraps the shared SessionStatus to expose only budget-related queries. Passed to bridge::register_llm() where it gates every alc.llm() and alc.llm_batch() call.

§Call site and threading

Both check() and remaining() are called exclusively from Lua closures registered in bridge.rs, which run on the Lua OS thread. They acquire std::sync::Mutex<SessionStatus> for a few microseconds (read-only field comparisons). See SessionStatus doc for full locking design.

§TOCTOU safety of Lua-side alc.budget_check()

The prelude’s alc.budget_check() calls remaining() then the caller decides whether to call alc.llm() (which calls check()). Between remaining() release and check() acquire, llm_calls could theoretically change — but within a single session this is structurally impossible: the Lua thread is the only writer path (via observer callbacks), and observer callbacks only fire after the Lua thread yields control through the mpsc channel. Lua is single-threaded and does not yield between budget_check() and alc.llm().

§Poison policy

check() propagates poison as Err — this surfaces as a Lua error, which is the correct behavior since a poisoned mutex indicates an unrecoverable state (OOM panic under lock). remaining() returns Null on poison — it is observational and non-fatal.

Implementations§

Source§

impl BudgetHandle

Source

pub fn check(&self) -> Result<(), String>

Check if the session is within budget. Returns Err with a message if exceeded.

Propagates mutex poison as Err (see BudgetHandle doc for rationale).

Source

pub fn remaining(&self) -> Value

Remaining budget as JSON: { llm_calls: N|null, elapsed_ms: N|null }. Returns serde_json::Value::Null if no budget is set.

Returns Null on mutex poison (observational, non-fatal).

Trait Implementations§

Source§

impl Clone for BudgetHandle

Source§

fn clone(&self) -> BudgetHandle

Returns a duplicate of the value. Read more
1.0.0 · Source§

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

Performs copy-assignment from source. 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, 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> 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.