Skip to main content

MeowMeowRunner

Struct MeowMeowRunner 

Source
pub struct MeowMeowRunner;
Expand description

Synchronous wrapper around MeowMeowEvaluator.

Spawns an evaluator thread, sends a script, drains all responses to completion, and returns the collected EvalOutput. The thread is shut down and joined before returning.

Implementations§

Source§

impl MeowMeowRunner

Source

pub fn eval(source: &str) -> EvalOutput

Evaluate source without a live ECS world, collecting emitted intents and errors.

This mode cannot allocate live ComponentIds during evaluation, so let-bound component expressions stay as ComponentExpr values rather than becoming live ComponentObject handles.

Times out after 2 seconds if the evaluator stalls.

Examples found in repository?
examples/vr-input-mms.rs (line 7)
3fn main() {
4    mittens_engine::example_support::ensure_model_assets();
5    utils::logger::init();
6
7    let output = scripting::MeowMeowRunner::eval(include_str!("vr-input.mms"));
8
9    for error in &output.errors {
10        eprintln!("[mms] {error}");
11    }
12    println!("[mms] {} intent(s) from vr-input.mms", output.intents.len());
13
14    let world = engine::ecs::World::default();
15    let mut universe = engine::Universe::new(world);
16
17    let scope = engine::ecs::ComponentId::default();
18    for intent in output.intents {
19        universe.command_queue.push_intent_now(scope, intent);
20    }
21
22    universe.systems.process_commands(
23        &mut universe.world,
24        &mut universe.visuals,
25        &mut universe.render_assets,
26        &mut universe.command_queue,
27    );
28
29    engine::Windowing::run_app(universe).expect("Windowing failed");
30}
More examples
Hide additional examples
examples/ui-layout.rs (line 7)
3fn main() {
4    mittens_engine::example_support::ensure_model_assets();
5    utils::logger::init();
6
7    let output = scripting::MeowMeowRunner::eval(include_str!("ui-layout.mms"));
8
9    for error in &output.errors {
10        eprintln!("[mms] {error}");
11    }
12    println!(
13        "[mms] {} intent(s) from ui-layout.mms",
14        output.intents.len()
15    );
16
17    let world = engine::ecs::World::default();
18    let mut universe = engine::Universe::new(world);
19
20    let scope = engine::ecs::ComponentId::default();
21    for intent in output.intents {
22        universe.command_queue.push_intent_now(scope, intent);
23    }
24
25    universe.systems.process_commands(
26        &mut universe.world,
27        &mut universe.visuals,
28        &mut universe.render_assets,
29        &mut universe.command_queue,
30    );
31
32    universe.enable_repl();
33    engine::Windowing::run_app(universe).expect("Windowing failed");
34}
examples/vtuber-desktop.rs (line 7)
3fn main() {
4    mittens_engine::example_support::ensure_model_assets();
5    utils::logger::init();
6
7    let output = scripting::MeowMeowRunner::eval(include_str!("vtuber-desktop.mms"));
8
9    for error in &output.errors {
10        eprintln!("[mms] {error}");
11    }
12    println!(
13        "[mms] {} intent(s) from vtuber-desktop.mms",
14        output.intents.len()
15    );
16
17    let world = engine::ecs::World::default();
18    let mut universe = engine::Universe::new(world);
19
20    let scope = engine::ecs::ComponentId::default();
21    for intent in output.intents {
22        universe.command_queue.push_intent_now(scope, intent);
23    }
24
25    universe.systems.process_commands(
26        &mut universe.world,
27        &mut universe.visuals,
28        &mut universe.render_assets,
29        &mut universe.command_queue,
30    );
31
32    universe.enable_repl();
33    engine::Windowing::run_app(universe).expect("Windowing failed");
34}
examples/inline-block-layout.rs (line 7)
3fn main() {
4    mittens_engine::example_support::ensure_model_assets();
5    utils::logger::init();
6
7    let output = scripting::MeowMeowRunner::eval(include_str!("inline-block-layout.mms"));
8
9    for error in &output.errors {
10        eprintln!("[mms] {error}");
11    }
12    println!(
13        "[mms] {} intent(s) from inline-block-layout.mms",
14        output.intents.len()
15    );
16
17    let world = engine::ecs::World::default();
18    let mut universe = engine::Universe::new(world);
19
20    let scope = engine::ecs::ComponentId::default();
21    for intent in output.intents {
22        universe.command_queue.push_intent_now(scope, intent);
23    }
24
25    universe.systems.process_commands(
26        &mut universe.world,
27        &mut universe.visuals,
28        &mut universe.render_assets,
29        &mut universe.command_queue,
30    );
31
32    universe.enable_repl();
33    engine::Windowing::run_app(universe).expect("Windowing failed");
34}
examples/vtuber-desktop-first-person.rs (line 7)
3fn main() {
4    mittens_engine::example_support::ensure_model_assets();
5    utils::logger::init();
6
7    let output = scripting::MeowMeowRunner::eval(include_str!("vtuber-desktop-first-person.mms"));
8
9    for error in &output.errors {
10        eprintln!("[mms] {error}");
11    }
12    println!(
13        "[mms] {} intent(s) from vtuber-desktop-first-person.mms",
14        output.intents.len()
15    );
16
17    let world = engine::ecs::World::default();
18    let mut universe = engine::Universe::new(world);
19
20    let scope = engine::ecs::ComponentId::default();
21    for intent in output.intents {
22        universe.command_queue.push_intent_now(scope, intent);
23    }
24
25    universe.systems.process_commands(
26        &mut universe.world,
27        &mut universe.visuals,
28        &mut universe.render_assets,
29        &mut universe.command_queue,
30    );
31
32    universe.enable_repl();
33    engine::Windowing::run_app(universe).expect("Windowing failed");
34}
examples/text-input.rs (line 7)
3fn main() {
4    mittens_engine::example_support::ensure_model_assets();
5    utils::logger::init();
6
7    let output = scripting::MeowMeowRunner::eval(include_str!("text-input.mms"));
8
9    for error in &output.errors {
10        eprintln!("[mms] {error}");
11    }
12    println!(
13        "[mms] {} intent(s) from text-input.mms",
14        output.intents.len()
15    );
16
17    if !output.errors.is_empty() {
18        std::process::exit(1);
19    }
20
21    let world = engine::ecs::World::default();
22    let mut universe = engine::Universe::new(world);
23
24    let scope = engine::ecs::ComponentId::default();
25    for intent in output.intents {
26        universe.command_queue.push_intent_now(scope, intent);
27    }
28
29    universe.systems.process_commands(
30        &mut universe.world,
31        &mut universe.visuals,
32        &mut universe.render_assets,
33        &mut universe.command_queue,
34    );
35
36    universe.enable_repl();
37    engine::Windowing::run_app(universe).expect("Windowing failed");
38}
Source

pub fn eval_with_timeout(source: &str, timeout: Duration) -> EvalOutput

Evaluate source with a caller-provided timeout.

Source

pub fn eval_with_path(source: &str, path: &str) -> EvalOutput

Evaluate source knowing it came from path (enables relative imports).

Source

pub fn eval_file(path: &str) -> EvalOutput

Read path from disk and evaluate it (enables relative imports).

Examples found in repository?
examples/vtuber-secondary-motion.rs (line 7)
3fn main() {
4    mittens_engine::example_support::ensure_model_assets();
5    utils::logger::init();
6    // A path-aware evaluation is required so the scene can import its MMS preset module.
7    let output = scripting::MeowMeowRunner::eval_file("examples/vtuber-secondary-motion.mms");
8    for error in &output.errors {
9        eprintln!("[mms] {error}");
10    }
11    assert!(
12        output.errors.is_empty(),
13        "MMS evaluation produced errors: {:?}",
14        output.errors
15    );
16
17    let mut universe = engine::Universe::new(engine::ecs::World::default());
18    let scope = engine::ecs::ComponentId::default();
19    for intent in output.intents {
20        universe.command_queue.push_intent_now(scope, intent);
21    }
22    universe.systems.process_commands(
23        &mut universe.world,
24        &mut universe.visuals,
25        &mut universe.render_assets,
26        &mut universe.command_queue,
27    );
28    universe.enable_repl();
29    engine::Windowing::run_app(universe).expect("Windowing failed");
30}
More examples
Hide additional examples
examples/mms-module-example.rs (line 22)
16fn main() {
17    mittens_engine::example_support::ensure_model_assets();
18    utils::logger::init();
19
20    // eval_file passes the path so `import "cat.mms"` resolves relative to
21    // examples/ — do NOT use include_str! here (that loses the path).
22    let output = scripting::MeowMeowRunner::eval_file("examples/mms-module-example.mms");
23
24    for error in &output.errors {
25        eprintln!("[mms] error: {error}");
26    }
27    assert!(
28        output.errors.is_empty(),
29        "MMS evaluation produced errors: {:?}",
30        output.errors,
31    );
32
33    println!("[mms] {} intent(s):", output.intents.len());
34    for intent in &output.intents {
35        if let engine::ecs::IntentValue::SpawnComponentTree { root, .. } = intent {
36            println!("  spawn {}", root.component_type);
37        }
38    }
39
40    let world = engine::ecs::World::default();
41    let mut universe = engine::Universe::new(world);
42
43    let scope = engine::ecs::ComponentId::default();
44    for intent in output.intents {
45        universe.command_queue.push_intent_now(scope, intent);
46    }
47
48    // Camera placed to see the cat from slightly above and in front.
49    example_util::spawn_mms_demo_rig(&mut universe, [0.0, 1.2, 4.5]);
50
51    universe.systems.process_commands(
52        &mut universe.world,
53        &mut universe.visuals,
54        &mut universe.render_assets,
55        &mut universe.command_queue,
56    );
57
58    engine::Windowing::run_app(universe).expect("Windowing failed");
59}
examples/render-graph-diagram.rs (line 25)
21fn main() {
22    mittens_engine::example_support::ensure_model_assets();
23    utils::logger::init();
24
25    let output = scripting::MeowMeowRunner::eval_file("examples/render-graph-diagram.mms");
26
27    for error in &output.errors {
28        eprintln!("[mms] error: {error}");
29    }
30    if !output.errors.is_empty() {
31        eprintln!(
32            "[mms] {} error(s) — scene may be incomplete",
33            output.errors.len()
34        );
35    }
36
37    println!("[mms] {} intent(s) emitted:", output.intents.len());
38    for intent in &output.intents {
39        if let engine::ecs::IntentValue::SpawnComponentTree { root, .. } = intent {
40            println!("  spawn {}", root.component_type);
41        }
42    }
43
44    let world = engine::ecs::World::default();
45    let mut universe = engine::Universe::new(world);
46
47    // Push all MMS-emitted intents into the engine.
48    let scope = engine::ecs::ComponentId::default();
49    for intent in output.intents {
50        universe.command_queue.push_intent_now(scope, intent);
51    }
52
53    // Camera: pulled back and slightly elevated so the full scene is in view.
54    // The emissive orbs above the pedestals are the focal point.
55    example_util::spawn_mms_demo_rig(&mut universe, [0.0, 2.2, 7.0]);
56
57    universe.systems.process_commands(
58        &mut universe.world,
59        &mut universe.visuals,
60        &mut universe.render_assets,
61        &mut universe.command_queue,
62    );
63
64    engine::Windowing::run_app(universe).expect("Windowing failed");
65}
Source

pub fn eval_file_with_timeout(path: &str, timeout: Duration) -> EvalOutput

Read path from disk and evaluate it (enables relative imports) with a caller-provided timeout.

Examples found in repository?
examples/bloom.rs (lines 8-11)
4fn main() {
5    mittens_engine::example_support::ensure_model_assets();
6    utils::logger::init();
7
8    let output = scripting::MeowMeowRunner::eval_file_with_timeout(
9        "examples/bloom.mms",
10        Duration::from_secs(10),
11    );
12
13    for error in &output.errors {
14        eprintln!("[mms] error: {error}");
15    }
16    assert!(
17        output.errors.is_empty(),
18        "MMS evaluation produced errors: {:?}",
19        output.errors,
20    );
21
22    println!("[mms] {} intent(s) from bloom.mms", output.intents.len());
23
24    let world = engine::ecs::World::default();
25    let mut universe = engine::Universe::new(world);
26
27    let scope = engine::ecs::ComponentId::default();
28    for intent in output.intents {
29        universe.command_queue.push_intent_now(scope, intent);
30    }
31
32    universe.systems.process_commands(
33        &mut universe.world,
34        &mut universe.visuals,
35        &mut universe.render_assets,
36        &mut universe.command_queue,
37    );
38
39    engine::Windowing::run_app(universe).expect("Windowing failed");
40}
More examples
Hide additional examples
examples/camera-constraint.rs (lines 8-11)
4fn main() {
5    mittens_engine::example_support::ensure_model_assets();
6    utils::logger::init();
7
8    let output = scripting::MeowMeowRunner::eval_file_with_timeout(
9        "examples/camera-constraint.mms",
10        Duration::from_secs(10),
11    );
12
13    for error in &output.errors {
14        eprintln!("[mms] error: {error}");
15    }
16    assert!(
17        output.errors.is_empty(),
18        "MMS evaluation produced errors: {:?}",
19        output.errors,
20    );
21
22    println!(
23        "[mms] {} intent(s) from camera-constraint.mms",
24        output.intents.len()
25    );
26
27    let world = engine::ecs::World::default();
28    let mut universe = engine::Universe::new(world);
29
30    let scope = engine::ecs::ComponentId::default();
31    for intent in output.intents {
32        universe.command_queue.push_intent_now(scope, intent);
33    }
34
35    universe.systems.process_commands(
36        &mut universe.world,
37        &mut universe.visuals,
38        &mut universe.render_assets,
39        &mut universe.command_queue,
40    );
41
42    engine::Windowing::run_app(universe).expect("Windowing failed");
43}
Source

pub fn load_module_source( source: &str, source_path: Option<&str>, ) -> Result<LoadedMmsModule, String>

Source

pub fn load_module_file(path: &str) -> Result<LoadedMmsModule, String>

Source

pub fn call_mms_module_fn( module: &LoadedMmsModule, name: &str, args: Vec<Value>, channels: Option<&mut EvalChannels>, world_host: Option<&mut World>, emit: Option<&mut dyn SignalEmitter>, ) -> Result<Value, String>

Source

pub fn materialize_mms_module_component( module: &LoadedMmsModule, name: &str, args: Vec<Value>, world_host: Option<&mut World>, emit: Option<&mut dyn SignalEmitter>, ) -> Result<MaterializedCE, String>

Source

pub fn materialize_mms_module_component_in_mode( module: &LoadedMmsModule, name: &str, args: Vec<Value>, world_host: Option<&mut World>, emit: Option<&mut dyn SignalEmitter>, mode: ModuleFactoryEvalMode, ) -> Result<MaterializedCE, String>

Source

pub fn materialize_mms_module_component_from_file( path: &str, name: &str, args: Vec<Value>, world_host: Option<&mut World>, emit: Option<&mut dyn SignalEmitter>, ) -> Result<MaterializedCE, String>

Source

pub fn spawn_mms_module_component_uninitialized( module: &LoadedMmsModule, name: &str, args: Vec<Value>, world: &mut World, emit: &mut dyn SignalEmitter, ) -> Result<ComponentId, String>

Source

pub fn spawn_mms_module_component_uninitialized_with_assets( module: &LoadedMmsModule, name: &str, args: Vec<Value>, world: &mut World, render_assets: Option<&mut RenderAssets>, emit: &mut dyn SignalEmitter, ) -> Result<ComponentId, String>

Source

pub fn spawn_mms_module_component_uninitialized_from_file( path: &str, name: &str, args: Vec<Value>, world: &mut World, emit: &mut dyn SignalEmitter, ) -> Result<ComponentId, String>

Source

pub fn spawn_mms_module_component( module: &LoadedMmsModule, name: &str, args: Vec<Value>, parent: Option<ComponentId>, world: &mut World, emit: &mut dyn SignalEmitter, ) -> Result<ComponentId, String>

Source

pub fn spawn_mms_module_component_from_file( path: &str, name: &str, args: Vec<Value>, parent: Option<ComponentId>, world: &mut World, emit: &mut dyn SignalEmitter, ) -> Result<ComponentId, String>

Source

pub fn eval_with_world( source: &str, world: &mut World, rx: &mut RxWorld, emit: &mut dyn SignalEmitter, ) -> EvalOutput

Evaluate source with live world access.

Handles two HostCall kinds during evaluation:

  • Spawn: spawns the component tree into world and returns the root ComponentId. let x = T {} binds a ComponentObject(id) instead of a dead ComponentExpr.
  • RegisterHandler: installs an MMS function as a scoped signal handler in rx. on(obj, "Click", fn(e) { ... }) registers without blocking the evaluator.
Examples found in repository?
examples/qdebug.rs (lines 8-13)
2fn main() {
3    mittens_engine::example_support::ensure_model_assets();
4    utils::logger::init();
5    let world = engine::ecs::World::default();
6    let mut universe = engine::Universe::new(world);
7    let src = include_str!("qdebug.mms");
8    let out = scripting::MeowMeowRunner::eval_with_world(
9        src,
10        &mut universe.world,
11        &mut universe.systems.rx,
12        &mut universe.command_queue,
13    );
14    for e in &out.errors {
15        eprintln!("[mms-err] {e}");
16    }
17    println!("intents: {}", out.intents.len());
18    for c in universe.world.all_components() {
19        if let Some(label) = universe.world.component_label(c) {
20            {
21                println!(
22                    "  comp {:?} type={:?} name={:?}",
23                    c,
24                    universe.world.component_name(c),
25                    label
26                );
27            }
28        }
29    }
30}
More examples
Hide additional examples
examples/query-demo.rs (lines 18-23)
10fn main() {
11    mittens_engine::example_support::ensure_model_assets();
12    utils::logger::init();
13
14    let world = engine::ecs::World::default();
15    let mut universe = engine::Universe::new(world);
16
17    let source = include_str!("query-demo.mms");
18    let output = scripting::MeowMeowRunner::eval_with_world(
19        source,
20        &mut universe.world,
21        &mut universe.systems.rx,
22        &mut universe.command_queue,
23    );
24
25    for err in &output.errors {
26        eprintln!("[mms] {err}");
27    }
28    if !output.errors.is_empty() {
29        std::process::exit(1);
30    }
31
32    for intent in output.intents {
33        universe
34            .command_queue
35            .push_intent_now(engine::ecs::ComponentId::default(), intent);
36    }
37
38    universe.systems.process_commands(
39        &mut universe.world,
40        &mut universe.visuals,
41        &mut universe.render_assets,
42        &mut universe.command_queue,
43    );
44
45    universe.enable_repl();
46    engine::Windowing::run_app(universe).expect("Windowing failed");
47}
examples/component-method-call.rs (lines 20-25)
12fn main() {
13    mittens_engine::example_support::ensure_model_assets();
14    utils::logger::init();
15
16    let world = engine::ecs::World::default();
17    let mut universe = engine::Universe::new(world);
18
19    let source = include_str!("component-method-call.mms");
20    let output = scripting::MeowMeowRunner::eval_with_world(
21        source,
22        &mut universe.world,
23        &mut universe.systems.rx,
24        &mut universe.command_queue,
25    );
26
27    for err in &output.errors {
28        eprintln!("[mms] {err}");
29    }
30    if !output.errors.is_empty() {
31        std::process::exit(1);
32    }
33
34    for intent in output.intents {
35        universe
36            .command_queue
37            .push_intent_now(engine::ecs::ComponentId::default(), intent);
38    }
39
40    universe.systems.process_commands(
41        &mut universe.world,
42        &mut universe.visuals,
43        &mut universe.render_assets,
44        &mut universe.command_queue,
45    );
46
47    universe.enable_repl();
48    engine::Windowing::run_app(universe).expect("Windowing failed");
49}
examples/signal-handler.rs (lines 19-24)
9fn main() {
10    mittens_engine::example_support::ensure_model_assets();
11    utils::logger::init();
12
13    let world = engine::ecs::World::default();
14    let mut universe = engine::Universe::new(world);
15
16    // Evaluate the MMS script with live world access.
17    // on() calls inside the script register Click handlers into universe.systems.rx.
18    let source = include_str!("signal-handler.mms");
19    let output = scripting::MeowMeowRunner::eval_with_world(
20        source,
21        &mut universe.world,
22        &mut universe.systems.rx,
23        &mut universe.command_queue,
24    );
25
26    for err in &output.errors {
27        eprintln!("[mms] {err}");
28    }
29    if !output.errors.is_empty() {
30        std::process::exit(1);
31    }
32
33    // Any bare CE emissions from the script (not let-bound) are in output.intents.
34    // Our script only uses let-bindings so this is empty, but handle it anyway.
35    for intent in output.intents {
36        universe
37            .command_queue
38            .push_intent_now(engine::ecs::ComponentId::default(), intent);
39    }
40
41    universe.systems.process_commands(
42        &mut universe.world,
43        &mut universe.visuals,
44        &mut universe.render_assets,
45        &mut universe.command_queue,
46    );
47
48    universe.enable_repl();
49    engine::Windowing::run_app(universe).expect("Windowing failed");
50}
Source

pub fn eval_with_world_at_path( source: &str, source_path: Option<&str>, world: &mut World, rx: &mut RxWorld, emit: &mut dyn SignalEmitter, ) -> EvalOutput

Like eval_with_world, but also records the source file path so import statements resolve relative to it.

Examples found in repository?
examples/mms-tables.rs (lines 10-16)
3fn main() {
4    mittens_engine::example_support::ensure_model_assets();
5    utils::logger::init();
6
7    let world = engine::ecs::World::default();
8    let mut universe = engine::Universe::new(world);
9
10    let output = scripting::MeowMeowRunner::eval_with_world_at_path(
11        include_str!("mms-tables.mms"),
12        Some("examples/mms-tables.mms"),
13        &mut universe.world,
14        &mut universe.systems.rx,
15        &mut universe.command_queue,
16    );
17
18    for error in &output.errors {
19        eprintln!("[mms] {error}");
20    }
21    println!(
22        "[mms] {} intent(s) from mms-tables.mms",
23        output.intents.len()
24    );
25
26    let scope = engine::ecs::ComponentId::default();
27    for intent in output.intents {
28        universe.command_queue.push_intent_now(scope, intent);
29    }
30
31    universe.systems.process_commands(
32        &mut universe.world,
33        &mut universe.visuals,
34        &mut universe.render_assets,
35        &mut universe.command_queue,
36    );
37
38    universe.enable_repl();
39    engine::Windowing::run_app(universe).expect("Windowing failed");
40}
More examples
Hide additional examples
examples/input-xr-gamepad.rs (lines 10-16)
3fn main() {
4    mittens_engine::example_support::ensure_model_assets();
5    utils::logger::init();
6
7    let world = engine::ecs::World::default();
8    let mut universe = engine::Universe::new(world);
9
10    let output = scripting::MeowMeowRunner::eval_with_world_at_path(
11        include_str!("input-xr-gamepad.mms"),
12        Some("examples/input-xr-gamepad.mms"),
13        &mut universe.world,
14        &mut universe.systems.rx,
15        &mut universe.command_queue,
16    );
17
18    for error in &output.errors {
19        eprintln!("[mms] {error}");
20    }
21    println!(
22        "[mms] {} intent(s) from input-xr-gamepad.mms",
23        output.intents.len()
24    );
25
26    let scope = engine::ecs::ComponentId::default();
27    for intent in output.intents {
28        universe.command_queue.push_intent_now(scope, intent);
29    }
30
31    universe.systems.process_commands(
32        &mut universe.world,
33        &mut universe.visuals,
34        &mut universe.render_assets,
35        &mut universe.command_queue,
36    );
37
38    universe.enable_repl();
39    engine::Windowing::run_app(universe).expect("Windowing failed");
40}
examples/font-size.rs (lines 11-17)
3fn main() {
4    mittens_engine::example_support::ensure_model_assets();
5    utils::logger::init();
6
7    let world = engine::ecs::World::default();
8    let mut universe = engine::Universe::new(world);
9
10    let source = include_str!("font-size.mms");
11    let output = scripting::MeowMeowRunner::eval_with_world_at_path(
12        source,
13        Some("examples/font-size.mms"),
14        &mut universe.world,
15        &mut universe.systems.rx,
16        &mut universe.command_queue,
17    );
18
19    for error in &output.errors {
20        eprintln!("[mms] {error}");
21    }
22    println!(
23        "[mms] {} intent(s) from font-size.mms",
24        output.intents.len()
25    );
26
27    for intent in output.intents {
28        universe
29            .command_queue
30            .push_intent_now(engine::ecs::ComponentId::default(), intent);
31    }
32
33    universe.systems.process_commands(
34        &mut universe.world,
35        &mut universe.visuals,
36        &mut universe.render_assets,
37        &mut universe.command_queue,
38    );
39
40    universe.enable_repl();
41    engine::Windowing::run_app(universe).expect("Windowing failed");
42}
examples/table-field-reassign.rs (lines 10-16)
3fn main() {
4    mittens_engine::example_support::ensure_model_assets();
5    utils::logger::init();
6
7    let world = engine::ecs::World::default();
8    let mut universe = engine::Universe::new(world);
9
10    let output = scripting::MeowMeowRunner::eval_with_world_at_path(
11        include_str!("table-field-reassign.mms"),
12        Some("examples/table-field-reassign.mms"),
13        &mut universe.world,
14        &mut universe.systems.rx,
15        &mut universe.command_queue,
16    );
17
18    for error in &output.errors {
19        eprintln!("[mms] {error}");
20    }
21    println!(
22        "[mms] {} intent(s) from table-field-reassign.mms",
23        output.intents.len()
24    );
25
26    let scope = engine::ecs::ComponentId::default();
27    for intent in output.intents {
28        universe.command_queue.push_intent_now(scope, intent);
29    }
30
31    universe.systems.process_commands(
32        &mut universe.world,
33        &mut universe.visuals,
34        &mut universe.render_assets,
35        &mut universe.command_queue,
36    );
37
38    universe.enable_repl();
39    engine::Windowing::run_app(universe).expect("Windowing failed");
40}
examples/world-panel.rs (lines 11-17)
3fn main() {
4    mittens_engine::example_support::ensure_model_assets();
5    utils::logger::init();
6
7    let world = engine::ecs::World::default();
8    let mut universe = engine::Universe::new(world);
9
10    let source = include_str!("world-panel.mms");
11    let output = scripting::MeowMeowRunner::eval_with_world_at_path(
12        source,
13        Some("examples/world-panel.mms"),
14        &mut universe.world,
15        &mut universe.systems.rx,
16        &mut universe.command_queue,
17    );
18
19    for error in &output.errors {
20        eprintln!("[mms] {error}");
21    }
22    println!(
23        "[mms] {} intent(s) from world-panel.mms",
24        output.intents.len()
25    );
26
27    for intent in output.intents {
28        universe
29            .command_queue
30            .push_intent_now(engine::ecs::ComponentId::default(), intent);
31    }
32
33    universe.systems.process_commands(
34        &mut universe.world,
35        &mut universe.visuals,
36        &mut universe.render_assets,
37        &mut universe.command_queue,
38    );
39
40    universe.enable_repl();
41    engine::Windowing::run_app(universe).expect("Windowing failed");
42}
examples/padding-demo.rs (lines 11-17)
3fn main() {
4    mittens_engine::example_support::ensure_model_assets();
5    utils::logger::init();
6
7    let world = engine::ecs::World::default();
8    let mut universe = engine::Universe::new(world);
9
10    let source = include_str!("padding-demo.mms");
11    let output = scripting::MeowMeowRunner::eval_with_world_at_path(
12        source,
13        Some("examples/padding-demo.mms"),
14        &mut universe.world,
15        &mut universe.systems.rx,
16        &mut universe.command_queue,
17    );
18
19    for error in &output.errors {
20        eprintln!("[mms] {error}");
21    }
22    println!(
23        "[mms] {} intent(s) from padding-demo.mms",
24        output.intents.len()
25    );
26
27    for intent in output.intents {
28        universe
29            .command_queue
30            .push_intent_now(engine::ecs::ComponentId::default(), intent);
31    }
32
33    universe.systems.process_commands(
34        &mut universe.world,
35        &mut universe.visuals,
36        &mut universe.render_assets,
37        &mut universe.command_queue,
38    );
39
40    universe.enable_repl();
41    engine::Windowing::run_app(universe).expect("Windowing failed");
42}
Source

pub fn eval_with_world_and_assets( source: &str, world: &mut World, rx: &mut RxWorld, render_assets: &mut RenderAssets, emit: &mut dyn SignalEmitter, ) -> EvalOutput

Evaluate source with live world + render-asset access.

Source

pub fn eval_with_world_and_assets_at_path( source: &str, source_path: Option<&str>, world: &mut World, rx: &mut RxWorld, render_assets: Option<&mut RenderAssets>, emit: &mut dyn SignalEmitter, ) -> EvalOutput

Like eval_with_world_and_assets, but also records the source file path so import statements resolve relative to it.

Examples found in repository?
examples/pride.rs (lines 10-17)
3fn main() {
4    mittens_engine::example_support::ensure_model_assets();
5    utils::logger::init();
6
7    let world = engine::ecs::World::default();
8    let mut universe = engine::Universe::new(world);
9
10    let output = scripting::MeowMeowRunner::eval_with_world_and_assets_at_path(
11        include_str!("pride.mms"),
12        Some("examples/pride.mms"),
13        &mut universe.world,
14        &mut universe.systems.rx,
15        Some(&mut universe.render_assets),
16        &mut universe.command_queue,
17    );
18
19    for error in &output.errors {
20        eprintln!("[mms] {error}");
21    }
22    assert!(
23        output.errors.is_empty(),
24        "MMS evaluation produced errors: {:?}",
25        output.errors,
26    );
27
28    let scope = engine::ecs::ComponentId::default();
29    for intent in output.intents {
30        universe.command_queue.push_intent_now(scope, intent);
31    }
32
33    universe.systems.process_commands(
34        &mut universe.world,
35        &mut universe.visuals,
36        &mut universe.render_assets,
37        &mut universe.command_queue,
38    );
39
40    engine::Windowing::run_app(universe).expect("Windowing failed");
41}
More examples
Hide additional examples
examples/clip-shape.rs (lines 10-17)
3fn main() {
4    mittens_engine::example_support::ensure_model_assets();
5    utils::logger::init();
6
7    let world = engine::ecs::World::default();
8    let mut universe = engine::Universe::new(world);
9
10    let output = scripting::MeowMeowRunner::eval_with_world_and_assets_at_path(
11        include_str!("clip-shape.mms"),
12        Some("examples/clip-shape.mms"),
13        &mut universe.world,
14        &mut universe.systems.rx,
15        Some(&mut universe.render_assets),
16        &mut universe.command_queue,
17    );
18
19    for error in &output.errors {
20        eprintln!("[mms] {error}");
21    }
22    assert!(
23        output.errors.is_empty(),
24        "MMS evaluation produced errors: {:?}",
25        output.errors,
26    );
27
28    let scope = engine::ecs::ComponentId::default();
29    for intent in output.intents {
30        universe.command_queue.push_intent_now(scope, intent);
31    }
32
33    universe.systems.process_commands(
34        &mut universe.world,
35        &mut universe.visuals,
36        &mut universe.render_assets,
37        &mut universe.command_queue,
38    );
39
40    engine::Windowing::run_app(universe).expect("Windowing failed");
41}
examples/neon-kawaii.rs (lines 10-17)
3fn main() {
4    mittens_engine::example_support::ensure_model_assets();
5    utils::logger::init();
6
7    let world = engine::ecs::World::default();
8    let mut universe = engine::Universe::new(world);
9
10    let output = scripting::MeowMeowRunner::eval_with_world_and_assets_at_path(
11        include_str!("neon-kawaii.mms"),
12        Some("examples/neon-kawaii.mms"),
13        &mut universe.world,
14        &mut universe.systems.rx,
15        Some(&mut universe.render_assets),
16        &mut universe.command_queue,
17    );
18
19    for error in &output.errors {
20        eprintln!("[mms] {error}");
21    }
22    assert!(
23        output.errors.is_empty(),
24        "MMS evaluation produced errors: {:?}",
25        output.errors,
26    );
27
28    let scope = engine::ecs::ComponentId::default();
29    for intent in output.intents {
30        universe.command_queue.push_intent_now(scope, intent);
31    }
32
33    universe.systems.process_commands(
34        &mut universe.world,
35        &mut universe.visuals,
36        &mut universe.render_assets,
37        &mut universe.command_queue,
38    );
39
40    engine::Windowing::run_app(universe).expect("Windowing failed");
41}
examples/bisket-desktop-demo.rs (lines 10-17)
3fn main() {
4    mittens_engine::example_support::ensure_model_assets();
5    utils::logger::init();
6
7    let world = engine::ecs::World::default();
8    let mut universe = engine::Universe::new(world);
9
10    let output = scripting::MeowMeowRunner::eval_with_world_and_assets_at_path(
11        include_str!("bisket-desktop-demo.mms"),
12        Some("examples/bisket-desktop-demo.mms"),
13        &mut universe.world,
14        &mut universe.systems.rx,
15        Some(&mut universe.render_assets),
16        &mut universe.command_queue,
17    );
18
19    for error in &output.errors {
20        eprintln!("[mms] {error}");
21    }
22    assert!(
23        output.errors.is_empty(),
24        "MMS evaluation produced errors: {:?}",
25        output.errors,
26    );
27
28    let scope = engine::ecs::ComponentId::default();
29    for intent in output.intents {
30        universe.command_queue.push_intent_now(scope, intent);
31    }
32
33    universe.systems.process_commands(
34        &mut universe.world,
35        &mut universe.visuals,
36        &mut universe.render_assets,
37        &mut universe.command_queue,
38    );
39
40    engine::Windowing::run_app(universe).expect("Windowing failed");
41}
examples/bisket-vr-only-example.rs (lines 9-16)
3fn main() {
4    mittens_engine::example_support::ensure_model_assets();
5    utils::logger::init();
6
7    let world = engine::ecs::World::default();
8    let mut universe = engine::Universe::new(world);
9    let output = scripting::MeowMeowRunner::eval_with_world_and_assets_at_path(
10        include_str!("bisket-vr-only-example.mms"),
11        Some("examples/bisket-vr-only-example.mms"),
12        &mut universe.world,
13        &mut universe.systems.rx,
14        Some(&mut universe.render_assets),
15        &mut universe.command_queue,
16    );
17
18    for error in &output.errors {
19        eprintln!("[mms] {error}");
20    }
21    assert!(
22        output.errors.is_empty(),
23        "MMS evaluation produced errors: {:?}",
24        output.errors,
25    );
26
27    let scope = engine::ecs::ComponentId::default();
28    for intent in output.intents {
29        universe.command_queue.push_intent_now(scope, intent);
30    }
31    universe.systems.process_commands(
32        &mut universe.world,
33        &mut universe.visuals,
34        &mut universe.render_assets,
35        &mut universe.command_queue,
36    );
37
38    engine::Windowing::run_app(universe).expect("Windowing failed");
39}
examples/rotate-look-at-example.rs (lines 10-17)
3fn main() {
4    mittens_engine::example_support::ensure_model_assets();
5    utils::logger::init();
6
7    let world = engine::ecs::World::default();
8    let mut universe = engine::Universe::new(world);
9
10    let output = scripting::MeowMeowRunner::eval_with_world_and_assets_at_path(
11        include_str!("rotate-look-at-example.mms"),
12        Some("examples/rotate-look-at-example.mms"),
13        &mut universe.world,
14        &mut universe.systems.rx,
15        Some(&mut universe.render_assets),
16        &mut universe.command_queue,
17    );
18
19    for error in &output.errors {
20        eprintln!("[mms] {error}");
21    }
22    assert!(
23        output.errors.is_empty(),
24        "MMS evaluation produced errors: {:?}",
25        output.errors,
26    );
27
28    let scope = engine::ecs::ComponentId::default();
29    for intent in output.intents {
30        universe.command_queue.push_intent_now(scope, intent);
31    }
32
33    universe.systems.process_commands(
34        &mut universe.world,
35        &mut universe.visuals,
36        &mut universe.render_assets,
37        &mut universe.command_queue,
38    );
39
40    engine::Windowing::run_app(universe).expect("Windowing failed");
41}

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> Downcast for T
where T: Any,

Source§

fn into_any(self: Box<T>) -> Box<dyn Any>

Convert Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.
Source§

fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>

Convert Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be further downcast into Rc<ConcreteType> where ConcreteType implements Trait.
Source§

fn as_any(&self) -> &(dyn Any + 'static)

Convert &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &Any’s vtable from &Trait’s.
Source§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Convert &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.
Source§

impl<T> DowncastSync for T
where T: Any + Send + Sync,

Source§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Sync + Send>

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be further downcast into Arc<ConcreteType> where ConcreteType implements Trait.
Source§

impl<S, T> Duplex<S> for T
where T: FromSample<S> + ToSample<S>,

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<S> FromSample<S> for S

Source§

fn from_sample_(s: S) -> S

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<F, T> IntoSample<T> for F
where T: FromSample<F>,

Source§

fn into_sample(self) -> T

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, U> ToSample<U> for T
where U: FromSample<T>,

Source§

fn to_sample_(self) -> U

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<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

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