Skip to main content

Statics

Struct Statics 

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

A collection of statics to declare when building a unit.

A static item usually comes from the source being compiled, but a host which wants to hand a script a piece of state does not necessarily want that state to be declared by the script. Statics declared here are added to the unit as if the source had declared them, so a script can read and write them by name without declaring them itself.

Such a static has no initializer, since there is no source to evaluate. This means it starts out uninitialized and reading it before anything has assigned it is a runtime error, exactly like a static N; in a script. The caller is expected to populate it through Globals::set before running anything which reads it.

Declaring a name which the source also declares is an error, since it is ambiguous which of the two declarations a use refers to.

§Examples

use rune::{Context, Source, Sources, Statics, Vm};
use rune::runtime::Globals;
use rune::sync::Arc;

let context = Context::with_default_modules()?;
let runtime = Arc::try_new(context.runtime()?)?;

let mut sources = Sources::new();
sources.insert(Source::memory(r#"
pub fn main() {
    LIMIT += 1;
    LIMIT
}
"#)?)?;

let mut statics = Statics::new();
statics.insert(["LIMIT"])?;

let unit = rune::prepare(&mut sources)
    .with_context(&context)
    .with_statics(&statics)
    .build()?;

let unit = Arc::try_new(unit)?;
let globals = Globals::new(unit.clone())?;
globals.set(["LIMIT"], rune::to_value(41i64)?)?;

let mut vm = Vm::new(runtime, unit).with_globals(globals);
let output = vm.call(["main"], ())?;
assert_eq!(rune::from_value::<i64>(output)?, 42);

Implementations§

Source§

impl Statics

Source

pub const fn new() -> Self

Construct an empty collection of statics.

Source

pub fn insert( &mut self, name: impl IntoIterator<Item: IntoComponent>, ) -> Result<()>

Declare a static with the given name.

The name is the item the static is declared as, so ["LIMIT"] declares it at the root of the unit and ["config", "LIMIT"] declares it inside of the config module. Every component has to be a valid identifier.

Declaring the same name twice does nothing the second time.

§Examples
use rune::Statics;

let mut statics = Statics::new();
statics.insert(["LIMIT"])?;
statics.insert(["config", "LIMIT"])?;
assert_eq!(statics.len(), 2);

statics.insert(["LIMIT"])?;
assert_eq!(statics.len(), 2);
Source

pub fn len(&self) -> usize

The number of statics being declared.

Source

pub fn is_empty(&self) -> bool

Test if the collection is empty.

Trait Implementations§

Source§

impl Debug for Statics

Source§

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

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

impl Default for Statics

Source§

fn default() -> Statics

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<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

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> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T> Same for T

Source§

type Output = T

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