soft3/neuron/rune/src/lib.rs

//! Rune source/runtime adapter for the local cell profile.
use cell_engine::{Error, RuntimeInput, RuntimePort, RuntimeStep};
use rune_ast::{Expr, Noun};
use rune_interp::{
    codec,
    machine::{Limits, Machine, Step},
};

#[derive(Default)]
pub struct Rune;
fn runtime(e: impl std::fmt::Debug) -> Error {
    Error::Runtime(format!("{e:?}"))
}
fn limits(steps: u64) -> Limits {
    Limits {
        steps,
        ..Limits::default()
    }
}
pub fn encode(value: &Noun) -> Result<Vec<u8>, Error> {
    codec::encode(value, 65_536, 128).map_err(runtime)
}
pub fn decode(bytes: &[u8]) -> Result<Noun, Error> {
    codec::decode(bytes, 65_536, 128).map_err(runtime)
}
pub fn display(bytes: &[u8]) -> Result<String, Error> {
    fn write(value: &Noun, out: &mut String) {
        match value {
            Noun::Atom(n) => out.push_str(&n.to_string()),
            Noun::Cell(h, t) => {
                out.push('[');
                write(h, out);
                out.push(' ');
                write(t, out);
                out.push(']');
            }
        }
    }
    let mut out = String::new();
    write(&decode(bytes)?, &mut out);
    Ok(out)
}
fn expression(source: &[u8]) -> Result<Expr, Error> {
    if source.len() > 8192 {
        return Err(Error::Budget);
    }
    let source = std::str::from_utf8(source).map_err(runtime)?;
    rune_parse::parse_bounded(source, 512).map_err(runtime)
}
fn literal(value: Noun) -> Expr {
    match value {
        Noun::Atom(n) => Expr::Atom(n),
        Noun::Cell(h, t) => Expr::Cell(Box::new(literal(*h)), Box::new(literal(*t))),
    }
}
impl RuntimePort for Rune {
    fn validate_value(&self, bytes: &[u8]) -> Result<(), Error> {
        decode(bytes).map(|_| ())
    }
    fn start(&self, input: RuntimeInput<'_>) -> Result<Vec<u8>, Error> {
        let mut subject = rune_subject::Subject::minimal();
        subject.mem = decode(input.state)?;
        if let Some(context) = input.context {
            let mut values = Vec::new();
            for bytes in context.chunks_exact(8) {
                values.push(Noun::Atom(u64::from_le_bytes(
                    bytes.try_into().map_err(runtime)?,
                )));
            }
            subject.here = Noun::cell(
                Noun::cell(values[0].clone(), values[1].clone()),
                Noun::cell(values[2].clone(), values[3].clone()),
            );
        }
        let body = Expr::Let {
            name: "event".into(),
            mold: None,
            value: Box::new(literal(decode(input.event)?)),
            body: Box::new(expression(input.source)?),
        };
        let formula = rune_lower::lower_bounded(body, 2048).map_err(runtime)?;
        Machine::new(subject.to_noun(), formula, limits(input.step_limit))
            .map_err(runtime)?
            .checkpoint()
            .map_err(runtime)
    }
    fn step(
        &self,
        checkpoint: &[u8],
        reply: Option<&[u8]>,
        slice: u64,
        total: u64,
    ) -> Result<RuntimeStep, Error> {
        let mut machine = Machine::restore(checkpoint, limits(total)).map_err(runtime)?;
        if let Some(bytes) = reply {
            machine.resume(decode(bytes)?).map_err(runtime)?;
        }
        let step = machine.run(slice).map_err(runtime)?;
        let used = machine.used_steps();
        Ok(match step {
            Step::Done(value) => RuntimeStep::Done {
                result: encode(&value)?,
                used,
            },
            Step::Yield => RuntimeStep::Yield {
                checkpoint: machine.checkpoint().map_err(runtime)?,
                used,
            },
            Step::Act { tag, arguments } => RuntimeStep::Act {
                tag,
                arguments: encode(&arguments)?,
                checkpoint: machine.checkpoint().map_err(runtime)?,
                used,
            },
            Step::Event { tag, selector } => RuntimeStep::Event {
                tag,
                selector: encode(&selector)?,
                checkpoint: machine.checkpoint().map_err(runtime)?,
                used,
            },
        })
    }
}
pub fn value(source: &str) -> Result<Vec<u8>, Error> {
    let formula =
        rune_lower::lower_bounded(expression(source.as_bytes())?, 2048).map_err(runtime)?;
    let mut machine = Machine::new(Noun::Atom(0), formula, limits(10_000)).map_err(runtime)?;
    match machine.run(10_001).map_err(runtime)? {
        Step::Done(value) => encode(&value),
        _ => Err(Error::Denied),
    }
}

Homonyms

soft3/cybergraph/src/lib.rs
soft3/crate/src/lib.rs
soft3/glia/import/lib.rs
warriors/joy/rs/lib.rs
neural/trident/src/lib.rs
cyb/shell/src/lib.rs
warriors/trisha/rs/lib.rs
soft3/nox/rs/lib.rs
soft3/tru/rs/lib.rs
soft3/glia/run/lib.rs
warriors/trisha/honeycrisp/lib.rs
warriors/trisha/wgpu/lib.rs
soft3/mudra/src/lib.rs
soft3/strata/src/lib.rs
cyb/prysm/rs/lib.rs
cyb/honeycrisp/src/lib.rs
soft3/foculus/src/lib.rs
warriors/trisha/neptune/lib.rs
cyb/core/src/lib.rs
soft3/lens/src/lib.rs
cyb/optica/src/lib.rs
soft3/mir/src/lib.rs
soft3/tok/rs/src/lib.rs
neural/rune/rs/ast/lib.rs
neural/trident/silicon/src/lib.rs
soft3/hemera/rs/src/lib.rs
neural/rs/dialect/src/lib.rs
neural/rune/rs/interp/lib.rs
cyb/honeycrisp/rane/src/lib.rs
soft3/radio/iroh-ffi/src/lib.rs
soft3/zheng/rs/src/lib.rs
soft3/strata/core/src/lib.rs
soft3/lens/ikat/src/lib.rs
neural/rs/mir-format/src/lib.rs
neural/rune/rs/compile/lib.rs
cyb/crates/cyb-reserve/src/lib.rs
soft3/radio/cyber-bao/src/lib.rs
soft3/radio/iroh-willow/src/lib.rs
cyb/crates/cyb/src/lib.rs
neural/rs/link/src/lib.rs
soft3/strata/proof/src/lib.rs
soft3/conformance/rs/src/lib.rs
soft3/neuron/node/src/lib.rs
neural/rune/rs/subject/lib.rs
soft3/radio/iroh-gossip/src/lib.rs
soft3/lens/binius/src/lib.rs
soft3/radio/iroh-blobs/src/lib.rs
neural/rs/codegen/src/lib.rs
soft3/neuron/model/src/lib.rs
neural/rune/rs/mold/lib.rs
neural/rune/rs/parse/lib.rs
neural/eidos/rs/src/lib.rs
neural/rs/macros/src/lib.rs
soft3/bbg/rs/src/lib.rs
soft3/radio/iroh-base/src/lib.rs
cyb/honeycrisp/unimem/src/lib.rs
soft3/neuron/engine/src/lib.rs
soft3/radio/iroh/src/lib.rs
soft3/radio/iroh-docs/src/lib.rs
soft3/radio/iroh-relay/src/lib.rs
neural/rs/sigil/src/lib.rs
soft3/lens/brakedown/src/lib.rs
neural/rune/rs/prysm/lib.rs
cyb/honeycrisp/aruminium/src/lib.rs
soft3/strata/kuro/rs/lib.rs
neural/rune/rs/parse-pure/lib.rs
soft3/lens/porphyry/src/lib.rs
cyb/honeycrisp/acpu/src/lib.rs
neural/rune/rs/lower/lib.rs
soft3/lens/assayer/src/lib.rs
soft3/radio/iroh-car/src/lib.rs
soft3/lens/core/src/lib.rs
soft3/hemera/wgsl/src/lib.rs
soft3/strata/ext/src/lib.rs
soft3/strata/nebu/rs/lib.rs
neural/rs/darwin-sys/src/lib.rs
neural/rune/rs/lex/lib.rs
soft3/strata/compute/src/lib.rs
neural/rs/core/src/lib.rs
soft3/radio/iroh-dns-server/src/lib.rs
soft3/radio/quinn/bench/src/lib.rs
cyb/evy/forks/bevy_tasks/src/lib.rs
soft3/radio/nettools/netwatch/src/lib.rs
soft3/lytics/rs/event/src/lib.rs
neural/inf/rs/plan/src/lib.rs
cyb/evy/crates/evy_engine_dispatch/src/lib.rs
cyb/evy/crates/evy_engine_core/src/lib.rs
soft3/strata/kuro/wgsl/src/lib.rs
soft3/radio/quinn/quinn-udp/src/lib.rs
cyb/wysm/crates/wasi/src/lib.rs
cyb/evy/forks/bevy_diagnostic/src/lib.rs
cyb/evy/forks/naga/src/lib.rs
warriors/erga/rs/mine-bench/src/lib.rs
soft3/radio/quinn/quinn-proto/src/lib.rs
cyb/evy/crates/evy_platform_caps/src/lib.rs
cyb/wysm/crates/wasmi/src/lib.rs
cyb/evy/crates/evy_engine_tasks/src/lib.rs
warriors/erga/rs/wallet/src/lib.rs
neural/inf/rs/eval/src/lib.rs
soft3/radio/tests/integration/src/lib.rs
cyb/evy/forks/bevy_image/src/lib.rs
neural/inf/rs/parse/src/lib.rs
soft3/strata/genies/wgsl/src/lib.rs
cyb/evy/crates/evy_prysm_core/src/lib.rs
cyb/evy/forks/bevy_sprite/src/lib.rs
neural/inf/rs/lex/src/lib.rs
soft3/strata/jali/rs/src/lib.rs
neural/inf/rs/source/src/lib.rs
cyb/evy/forks/bevy_core_pipeline/src/lib.rs
cyb/evy/forks/bevy_mesh/src/lib.rs
soft3/strata/genies/rs/src/lib.rs
cyb/wysm/crates/c_api/src/lib.rs
cyb/evy/forks/bevy_transform/src/lib.rs
cyb/wysm/crates/fuzz/src/lib.rs
soft3/radio/nettools/portmapper/src/lib.rs
neural/rs/tests/macro-integration/src/lib.rs
neural/inf/rs/lower/src/lib.rs
cyb/evy/forks/bevy_render/src/lib.rs
cyb/wysm/crates/ir/src/lib.rs
cyb/evy/forks/bevy_ecs/src/lib.rs
cyb/wysm/crates/wast/src/lib.rs
cyb/evy/forks/bevy_animation/src/lib.rs
cyb/wysm/crates/core/src/lib.rs
warriors/erga/rs/rtable-bench/src/lib.rs
cyb/evy/forks/bevy_post_process/src/lib.rs
soft3/strata/jali/wgsl/src/lib.rs
soft3/radio/quinn/quinn/src/lib.rs
soft3/tade/impl/rust/src/lib.rs
soft3/strata/trop/rs/src/lib.rs
cyb/wysm/crates/c_api/artifact/lib.rs
neural/inf/rs/value/src/lib.rs
cyb/evy/crates/evy_dialect/src/lib.rs
warriors/erga/rs/autolykos/src/lib.rs
warriors/erga/rs/app/src/lib.rs
neural/trident/editor/zed/src/lib.rs
warriors/erga/rs/blake-bench/src/lib.rs
cyb/evy/crates/evy_diagnostic/src/lib.rs
cyb/evy/forks/bevy_anti_alias/src/lib.rs
soft3/lytics/rs/core/src/lib.rs
soft3/radio/iroh-ffi/iroh-js/src/lib.rs
neural/inf/rs/oracle/src/lib.rs
cyb/evy/crates/evy_ecs_storage/src/lib.rs
soft3/radio/quinn/perf/src/lib.rs
cyb/evy/crates/evy_radio/src/lib.rs
cyb/evy/forks/bevy_pbr/src/lib.rs
warriors/erga/rs/miner/src/lib.rs
cyb/evy/forks/bevy_gizmos_render/src/lib.rs
soft3/strata/nebu/wgsl/src/lib.rs
soft3/radio/iroh/bench/src/lib.rs
cyb/wysm/crates/collections/src/lib.rs
warriors/erga/rs/pool/src/lib.rs
soft3/strata/trop/wgsl/src/lib.rs
cyb/evy/forks/bevy_sprite_render/src/lib.rs
cyb/wysm/crates/c_api/macro/lib.rs
cyb/evy/forks/bevy_gizmos/src/lib.rs
neural/inf/rs/ast/src/lib.rs

Graph