An embeddable dynamic programming language for Rust.

Overview

rune

Rune Logo



An embeddable dynamic programming language for Rust.

Contributing

If you want to help out, there should be a number of optimization tasks available in Future Optimizations. Or have a look at Open Issues.

Create an issue about the optimization you want to work on and communicate that you are working on it.


Highlights of Rune


Rune scripts

You can run Rune programs with the bundled CLI:

cargo run --bin rune -- run scripts/hello_world.rn

If you want to see detailed diagnostics of your program while it's running, you can use:

cargo run --bin rune -- run scripts/hello_world.rn --dump-unit --trace --dump-vm

See --help for more information.

Running scripts from Rust

You can find more examples in the examples folder.

The following is a complete example, including rich diagnostics using termcolor. It can be made much simpler if this is not needed.

use rune::{Context, Diagnostics, FromValue, Source, Sources, Vm};
use rune::termcolor::{ColorChoice, StandardStream};
use std::sync::Arc;

#[tokio::main]
async fn main() -> rune::Result<()> {
    let context = Context::with_default_modules()?;
    let runtime = Arc::new(context.runtime());

    let mut sources = Sources::new();
    sources.insert(Source::new(
        "script",
        r#"
        pub fn add(a, b) {
            a + b
        }
        "#,
    ));

    let mut diagnostics = Diagnostics::new();

    let result = rune::prepare(&mut sources)
        .with_context(&context)
        .with_diagnostics(&mut diagnostics)
        .build();

    if !diagnostics.is_empty() {
        let mut writer = StandardStream::stderr(ColorChoice::Always);
        diagnostics.emit(&mut writer, &sources)?;
    }

    let unit = result?;
    let mut vm = Vm::new(runtime, Arc::new(unit));

    let output = vm.call(&["add"], (10i64, 20i64))?;
    let output = i64::from_value(output)?;

    println!("{}", output);
    Ok(())
}
Comments
  • Project questions

    Project questions

    Hi, I'm trying to evaluate rune for my needs and I had some questions (apologies if I missed the relevant doc) that might be interesting to expose un a FAQ:

    • Can rune be used on no_std or WASM, and if so will it stay this way ? I've seen some plans to use cranelift that would probably not align with that if non-optional.
    • Can rune be considered a subset of Rust? I would be extremely interested in a solution that allows user-defined plugins to be injected with a automatable way of making them part of the rust app and therefore faster, at the price of a recompilation and installing a rust tool chain.
    question 
    opened by douglas-raillard-arm 2
  • Bump minimatch from 3.0.4 to 3.1.2 in /crates/rune-wasm

    Bump minimatch from 3.0.4 to 3.1.2 in /crates/rune-wasm

    Bumps minimatch from 3.0.4 to 3.1.2.

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
  • Alternative fallback fields implementation

    Alternative fallback fields implementation

    This is an alternative implementation to #440. This implementation is notably different in that it is more controllable by the implementor and feels more like a first class feature. The main changes are the addition of types deriving Any to state the priority of dynamic fields vs actual fields. The options are as follows:

    • First - Will try to find a dynamic field first before checking static fields.
    • Last - Will try to find a static field first before checking dynamic fields.
    • Never - Will completely disregard any dynamic fields and exclusively use static fields. (Same behavior as prior to this implementation and the default)
    • Only - Will completely disregard static fields and exclusively use dynamic fields.

    All of these can be applied to any type using the Derive(Any) macro by applying the attribute #[rune(dynamic_fields="never|only|first|last")] to the struct itself.

    Dynamic fields functionality is basically the same as the #440 however due to the fact First and Only exist means there needed to be a change to their implementation. DYNAMIC_FIELD_GET now handles Options slightly differently: if you return None it will presume there was no field, Some(None) is still a option if desired. The value will be unwrapped from the Option on the callers side so doesn't need to be worried about by the script writer. DYNAMIC_FIELD_SET is basically the same as DYNAMIC_FIELD_GET however instead of a Option you can choose to return false which will be treat as a failure to set the field, allowing it to try and set the static field next if the type is First or simply return a error otherwise as expected with static fields. For both of the above changes to DYNAMIC_FIELD_SET and DYNAMIC_FIELD_GET: you can return any other type (including () of course) and it will not treat it any differently to before.

    Examples

    A struct with dynamic fields which are prioritised over static fields:

    #[derive(Any, Clone)]
    #[rune(dynamic_fields="first")]
    struct TestStruct {
        values: HashMap<String, u32>,
        b: u32, 
        c: u32
    }
    

    implementing fallible DYNAMIC_FIELD_GET and DYNAMIC_FIELD_SET

    let mut module = Module::new();
    
    module.ty::<TestStruct>()?;
    module.inst_fn(
        Protocol::DYNAMIC_FIELD_GET,
        |this: &TestStruct, key: String| {
            if let Some(v) = this.values.get(&key) {
                Some(*v)
            } else {
    	    None
    	}
        },
    )?;
    module.inst_fn(
        Protocol::DYNAMIC_FIELD_SET,
        |this: &mut TestStruct, key: String, value: u32| {
            if key == "nerd" {
                false
            } else {
                this.values.insert(key, value);
                true
    	}
        },
    )?;
    

    Reasoning

    Sometimes it is desired for user readability to pretend a specific custom type has fields and instead accessing the data from elsewhere such as from a HashMap or another collection. possible use cases is having types with dynamic layouts while having rules to their usage such as locking the layout once created. it also allows custom types to be dynamically extended by the scripter while keeping the benefits of being a static Shared<AnyObj> but not seeming like a collection which [] accesses give the impression of.

    Benchmarks

    Note Due to the tiny footprints of the functions, the differences are very hard to see if any and can be improved within my benchmarks with a faster hashmap regardless but honestly values these small are easily within margin of error.

    Before

    test fields::actual_field_get                    ... bench:         418 ns/iter (+/- 88)
    test fields::actual_field_set                    ... bench:         434 ns/iter (+/- 161)
    
    test fields::string_key_classic_index_get        ... bench:         523 ns/iter (+/- 52)
    test fields::static_string_key_classic_index_get ... bench:         486 ns/iter (+/- 80)
    

    After

    test meta_fields::actual_field_get_first             ... bench:         614 ns/iter (+/- 18)
    test meta_fields::actual_field_get_last              ... bench:         420 ns/iter (+/- 46)
    test meta_fields::actual_field_get_never             ... bench:         414 ns/iter (+/- 27)
    test meta_fields::actual_field_set_first             ... bench:         514 ns/iter (+/- 63)
    test meta_fields::actual_field_set_last              ... bench:         427 ns/iter (+/- 14)
    test meta_fields::actual_field_set_never             ... bench:         408 ns/iter (+/- 28)
    test meta_fields::actual_field_set_only              ... bench:         515 ns/iter (+/- 16)
    test meta_fields::static_string_index_get_first      ... bench:         467 ns/iter (+/- 14)
    test meta_fields::static_string_index_get_last       ... bench:         471 ns/iter (+/- 35)
    test meta_fields::static_string_index_get_never      ... bench:         465 ns/iter (+/- 43)
    test meta_fields::static_string_index_get_only       ... bench:         459 ns/iter (+/- 17)
    test meta_fields::static_string_meta_field_get_first ... bench:         531 ns/iter (+/- 64)
    test meta_fields::static_string_meta_field_get_last  ... bench:         546 ns/iter (+/- 31)
    test meta_fields::static_string_meta_field_get_only  ... bench:         518 ns/iter (+/- 35)
    test meta_fields::static_string_meta_field_set_first ... bench:         525 ns/iter (+/- 231)
    test meta_fields::static_string_meta_field_set_last  ... bench:         545 ns/iter (+/- 42)
    test meta_fields::static_string_meta_field_set_only  ... bench:         515 ns/iter (+/- 34)
    test meta_fields::string_index_get_first             ... bench:         504 ns/iter (+/- 24)
    test meta_fields::string_index_get_last              ... bench:         505 ns/iter (+/- 42)
    test meta_fields::string_index_get_never             ... bench:         504 ns/iter (+/- 17)
    test meta_fields::string_index_get_only              ... bench:         501 ns/iter (+/- 20)
    test meta_fields::string_meta_field_get_first        ... bench:         552 ns/iter (+/- 21)
    test meta_fields::string_meta_field_get_last         ... bench:         595 ns/iter (+/- 26)
    test meta_fields::string_meta_field_get_only         ... bench:         558 ns/iter (+/- 26)
    test meta_fields::string_meta_field_set_first        ... bench:         508 ns/iter (+/- 23)
    test meta_fields::string_meta_field_set_last         ... bench:         553 ns/iter (+/- 39)
    test meta_fields::string_meta_field_set_only         ... bench:         510 ns/iter (+/- 23)
    

    Closes

    #381 #263

    enhancement lang 
    opened by LoopyAshy 11
  • Attempt FALLBACK_SET/GET on failure to find field via SET/GET

    Attempt FALLBACK_SET/GET on failure to find field via SET/GET

    I made it possible to fallback to ~~Protocol::INDEX_GET~~Protocol::FALLBACK_GET with StaticString/String key on failure to find a field via Protocol::GET, the same applies to ~~Protocol::INDEX_SET~~Protocol::FALLBACK_SET and Protocol::SET.

    Reasoning

    Sometimes it is desired for user readability to pretend a specific custom type has fields and instead accessing the data from elsewhere such as from a HashMap or another collection. possible use cases is having types with dynamic layouts while having rules to their usage such as locking the layout once created. it also allows custom types to be dynamically extended by the scripter while keeping the benefits of being a static Shared<AnyObj> but not seeming like a collection which [] accesses give the impression of.

    Benchmarks

    Note Due to the tiny footprints of the functions, the differences are very hard to see if any and can be improved with a faster hashmap regardless but honestly values these small are easily within margin of error.

    Before

    test fields::actual_field_get                    ... bench:         418 ns/iter (+/- 88)
    test fields::actual_field_set                    ... bench:         434 ns/iter (+/- 161)
    
    test fields::string_key_classic_index_get        ... bench:         523 ns/iter (+/- 52)
    test fields::static_string_key_classic_index_get ... bench:         486 ns/iter (+/- 80)
    

    After

    test fields::actual_field_get                     ... bench:         413 ns/iter (+/- 47)
    test fields::actual_field_set                     ... bench:         432 ns/iter (+/- 25)
    
    test fields::string_key_classic_index_get         ... bench:         500 ns/iter (+/- 14)
    test fields::static_string_key_classic_index_get  ... bench:         469 ns/iter (+/- 32)
    
    test fields::string_key_fallback_field_get        ... bench:         499 ns/iter (+/- 15)
    test fields::static_string_key_fallback_field_get ... bench:         469 ns/iter (+/- 20)
    
    test fields::string_fallback_field_set            ... bench:         596 ns/iter (+/- 24)
    test fields::static_string_fallback_field_set     ... bench:         608 ns/iter (+/- 14)
    

    Closes

    #381 #263

    Notes

    Regarding the changes done to this PR, I do wonder if FALLBACK_* is preferred choice compared to META_* or META_FIELD_* since in most script languages I have used, META usually implies it does it first/instead not after, which although being a option would be a fine choice.

    I do like the advantage of the current design being that it prioritises actual fields first.

    I do wonder if it was changed to use the 'meta' getter/setter first if it would be plausible to pass in the original field getter and setter functions so u could do this:

    |this: &Custom, default_get: NativeFunction, name: String| if let Ok(v) = default_get(name) {
        Ok(v)
    } else {
        //Do my field get
    }
    

    This approach however would have overhead and although could be faster for types which only want 'meta' fields I definitely feel it would cost for classic field get/sets which would be a waste and a shame and it isn't the most attractive solution regardless.

    Another possible solution could be explicitly declaring a type as having 'meta' fields and which order to prioritise finding them such as MetaFieldAccess::First MetaFieldAccess::Last, MetaFieldAccess::Always and finally MetaFieldAccess::Never(default) which would be drastically cheaper and simpler than it being passed in as a argument to the meta function which in my opinion reduces the understandability for implementors. The enum system could even be applied to the Any derive macro as an attribute to make it easy to implement and recognise by looking at types.

    opened by LoopyAshy 0
  • VSCode, commenting out lines not working

    VSCode, commenting out lines not working

    Repro:

    1. Open a .rn file with extension installed.
    2. Try to comment out code using Toggle line comment or Toggle block comment from Edit menu, or the shortcut equivalent.
    3. Lines will not be commented out, unlike with other languages.
    bug editor 
    opened by jakubtyrcha 1
  • Option not working in const variable

    Option not working in const variable

    Option Some(_) / None isn't working in const variables:

    error: query error
      โ”Œโ”€ test.rn:1:12
      โ”‚
    1 โ”‚ const C1 = None;
      โ”‚            ^^^^ no constant or local matching `None`
    
    error: query error
      โ”Œโ”€ test.rn:2:12
      โ”‚
    2 โ”‚ const C2 = Some(42);
      โ”‚            ^^^^^^^^ function not found
    
    opened by SWW13 1
Releases(0.12.0)
  • 0.10.3(Dec 16, 2021)

  • 0.10.2(Dec 9, 2021)

  • 0.10.1(Dec 6, 2021)

  • 0.10.0(Dec 2, 2021)

    For a guide on how to go from 0.9.x 0.10.x, see the upgrade guide for 0.9.x to 0.10.x.

    Changed

    • Rune is now a single rune crate instead of being divided between runestick and rune.
    • Completely overhauled how rune is compiled.
    • Changed how diagnostics is emitted.
    • Macros now take an explicit ctx macro rather than relying on TLS (#304).
    • Native functions no longer have to be Copy (#329).
    • Many types that used to be publicly exported are now hidden.
    • rune test (and rune bench) now captures all output (#354).

    Added

    • We can now compile rune source inside of macros (#302).
    • Basic benchmarking tool has been added to rune-cli through rune bench (#296).
    • Vm::with has been added so we can call functions like Value::string_display that "must be run withing a virtual machine" (#291).

    Fixed

    • Fixed issue when expanding template literals which prevents properly using them as expressions (#326) (thanks Steven0351!).
    • Constant values are not exported so they can be looked up in the unit (#316, #317) (thanks pkolaczk and tgolsson!).
    • Make SyncFunction documentation visible (#279).
    Source code(tar.gz)
    Source code(zip)
  • 0.9.1(Nov 28, 2021)

  • 0.9.0(Nov 28, 2021)

  • 0.8.0(Jan 19, 2021)

    0.8.0

    Added

    • Support for #[test] annotations (#218, #222) (thanks tgolsson!).
    • Add file!() and line!() macros (#168) (thanks tgolsson!).
    • Support for field functions and derives to implement them (#169, #170).
    • Support for crate in modules (#172).
    • std::any APIs for runtime inspection of types (#178) (thanks tgolsson!).
    • Support for range expressions (#180).
    • Missing implementations for FromValue conversions for i16 and u16 (#235) (thanks genusistimelord!).
    • More APIs and iterator-heavy benchmark (#232) (thanks tgolsson!).
    • Added initial benchmarks (#189).
    • Added cellular automata benchmark (#220) (thanks tgolsson!).
    • Added fibonacci and brainfuck benchmarks (#193) (thanks tgolsson!).
    • Projection APIs for internal Ref / RefMut (#211).
    • Many API additions and fixes (#219, #229, #233, #241, #196, #199, #185) (thanks tgolsson!).
    • Annotations to improve measuring the performance of individual operations in the VM (#190).
    • Pattern matching for booleans (#188) (thanks genusistimelord!).
    • Added support for continue inside of loops (#183).
    • Add support for registering and accessing runtime constants (#239).
    • Support for panicking pattern binding in function arguments (#195).
    • Added parsing for yet-to-be supported path segments (#206).
    • Add basic support for threaded execution (#97).

    Changed

    • Minor changes (#247, #208).
    • Improved CLI with cargo-like subcommands (#223) (thanks tgolsson!).
    • Compile-time metadata has been simplified (#163, #164).
    • Internal compiler improvements (#173, #174).
    • Make types used in Context iteration APIs public (#176).
    • Slim down the size of runtime meta (#177).
    • Change and improve how protocol functions are called (#210, #209).
    • Improve performance of runtime hashing (#191).
    • Improve diagnostics when using an exclusive reference which is not exclusive (#213).
    • Improve performance by reducing the number of copies generated (#194).
    • Make compile hooks refcounted for increased flexibility (#221).
    • Expose LSP server as a modular library for custom uses (#186) (thanks tgolsson!).
    • Improve performance of small objects by using BTreeMap for field storage (#231) (thanks tgolsson!).
    • Report errors and warnings through same diagnostics structure (#227, #228).

    Fixed

    • Minor fixes (#198, #201).
    • Documentation fixes and improvements (#248, #234, #242) (thanks robojumper, maxmcd, and hvithrafn!).
    • Fix negative fractional literals (#184) (thanks tgolsson!).
    • Various fixes for use in OxidizeBot (#161).
    • Bug with using wrong protocol for MUL and DIV (#167).
    • Add missing macro modules in rune-wasm (#171) (thanks tgolsson!).
    • Fixed buggy visibility checks for paths (#175).
    • Various fixes and improvements due to AoC (#181, #187, #192, #197, #203, #204, #205, #216, #217).
    • Give SourceLoader a lifetime (#245) (thanks tgolsson!).
    • Fix miscompilation in struct literals (#246) (thanks robojumper!).
    • Fix miscompilation in pattern matching (#214).
    • Introduced and fixed binding bug (#202).
    • Fix so that different variants of the same enum have different equalities (#215).
    • Make float associated fns associated (#240) (thanks tgolsson!).
    • Bump nanorand to fix incorrect generation of random numbers in rand module (#243) (thanks tgolsson!).
    • Fixed broken assembly of more than one if else (#230).
    Source code(tar.gz)
    Source code(zip)
  • 0.7.0(Oct 19, 2020)

    Added

    • The Rune project now has a Code of Conduct (#12).
    • Support for bitwise operations on numbers (#13, #20).
    • Book now has support for highlighting rune blocks (#14).
    • Preliminary support for modules without visibility (#16, #17).
    • Debug information for function variable names now reflect source (#24).
    • Initial support for macros (#29, #30, #31, #114, #135, #136, #137, #138, #141, #142, #143, #144).
    • Add cargo build cache (#36) (thanks shekohex!).
    • Rust quote! macro for Rune macro authors (#34).
    • Support for object- and tuple-like field assignments (#38, #39, #40, #66).
    • Support for lazy evaluation for and/or (&& / ||) (#50) (thanks seanchen1991!).
    • Add AsTokens, FromValue, ToValue, and Spanned derives (#41, #85, #87, #88, #113).
    • Visual studio code extension with syntax highlighting and basic language server (#46, #47, #48, #60, #74) (thanks killercup!).
      • As-you-type building (#49).
      • Jump to definitions (#61).
      • Multifile project support (#64).
      • Automatic downloading of language server binary (#69).
    • Non-zero exit status on script errors (#58, #59) (thanks killercup!).
    • Improve CLI by parsing arguments using structopt (#51) (thanks shekohex!).
    • Executing functions in the virtual machine can use external references (#52).
    • Remove unused instruction in loop (#53) (thanks genusistimelord!).
    • Tweak module dependencies to use native Rust modules (#54) (thanks killercup!).
    • Internal changes to support a future C FFI (#55).
    • Improving module API (#56).
    • Extending http module to deserialize JSON directly (#57) (thanks killercup!).
    • Automatic build releases on tags (#68).
    • Fixed locals bug with breaking control in the middle of an index get operation (#71).
    • Community site at https://rune-rs.github.io (#75).
    • Add WASM-based Playground to community site https://rune-rs.github.io (#77).
    • Support for limiting execution of rune-wasm (#80).
    • Support for modules, imports, re-exports, visibility, and path resolution (#83, #92, #98, #124, #125, #128, #129, #130, #131, #133, #134, #148, #155) (thanks dillonhicks!).
    • Add WASM support for a couple of showcased rune modules (#89).
    • Added runtime type information (RTTI) for values in Runestick (#90, #112).
    • Add a rand module to rune-modules (#100) (thanks aspenluxxxy!).
    • Initial support for constant evaluation (#93, #94, #99, #104, #105, #106, #107, #117, #122, #123, #153).
    • Add Args implementation for Vec (#147) (thanks MinusGix!).
    • Export a Function variant called SyncFunction that is thread-safe (#149, #151) (thanks MinusGix!).
    • Support move modifier to async blocks and closures to take ownership of values being used (#152).
    • Basic Iterator support (#156, #157) (thanks MinusGix!).
    • Support for calling protocol functions from native code using Interface (#159).

    Changed

    • Make units more efficient by separating runtime and compile-time metadata (#24).
    • Change the internal representation of Item to be more memory efficient (#63).
    • Make the implementation of ParseError and CompileError more consistent (#65).
    • Remove the rune-testing module (#67).
    • Made evaluation order of index set operations the same as Rust (#70).
    • Make hashing less error prone (#72).
    • Various parser changes and tests (#110).
    • Various internal changes (#103, #108, #109).
    • Parser simplifications (#120, #121).
    • Negative literals are handled as expressions (#132).
    • Syntax for template strings now follows EcmaScript (#145).

    Fixed

    • Introduced custom highlight.js to fix issue with hidden lines in the book (#10).
    • Semi-colons in blocks weren't required, they now are (#32).
    • Fixed field assignments (#38, #40) (thanks MinusGix!).
    • Book typos (#11, #18, #28, #37) (thanks Sparkpin, seanchen1991, stoically, and macginitie!).
    • Fix broken book links (#84, #86) (thanks dillonhicks!).
    • Fix pattern miscompilation (#62).
    • Fixed bug with Closure optimization where it's being treated as a function (#21, #22) (thanks MinusGix!).
    • Fixed a number of clippy lints (#35) (thanks shekohex!).
    • Fix using closures in literals, like (0, || 42) or #{a: || 42} (#78).
    • Shared access guards didn't implement Drop allowing them to leak their guarded value (#119).
    Source code(tar.gz)
    Source code(zip)
Owner
The Rune Programming Language
The Rune Programming Language
A simple, human-friendly, embeddable scripting language

Mica Language reference ยท Rust API A simple, human-friendly scripting language, developed one feature at a time. Human-friendly syntax inspired by Rub

Mica programming language 32 Dec 30, 2022
An Interpreter for Brainfuck programming language implemented in the Rust programming language with zero dependencies.

Brainfuck Hello, Visitor! Hey there, welcome to my project showcase website! It's great to have you here. I hope you're ready to check out some awesom

Syed Vilayat Ali Rizvi 7 Mar 31, 2023
A C-like programming language that is similar to Rust's syntax. Toy programming language.

CRUST This is a hobby project to learn about compilers and language design. I've designed the language to be similar to C and Rust. Heavily inspired b

Mahmoud Almontasser 50 Jul 13, 2024
Programming language made by me to learn other people how to make programming languages :3

Spectra programming language Programming language made for my tutorial videos (my youtube channel): Syntax Declaring a variable: var a = 3; Function

Adi Salimgereyev 3 Jul 25, 2023
The Amp programming language: a language designed for building high performance systems.

A language designed for building high performance systems. Platform Support x86_64-pc-windows โœ… x86_64-unknown-linux โš ๏ธ untested x86_64-unknown-darwin

The Amp Programming Language 5 Mar 17, 2023
Nexa programming language. A language for game developers by a game developer

NexaLang Nexa programming language. A language for game developers by a game developer. Features High-Level: Nexa is an easy high level language Two M

Sabe 3 Aug 21, 2023
Dynamic dependency injection library for rust.

DDI (dynamic dependency injection) This library provides a generic dependency injection container that can be easily integrated into any application a

EYHN 34 Feb 21, 2023
Dynamic, Type-Erased Key-Value Maps in Rust

Dynamic Objects in Rust Do you love Rust but are tired of being constrained by static typing when you need a map to hold values of different types? Do

Travis A. Wagner 12 Feb 25, 2024
Like a cell, but make lifetimes dynamic instead of ownership

LendingCell is a mutable container that allows you to get an owned reference to the same object. When the owned reference is dropped, ownership return

Kalle Samuels 19 Dec 15, 2022
Apple dynamic HEIF wallpapers on GNU/Linux.

timewall Apple dynamic HEIF wallpapers on GNU/Linux. Features: Support for original HEIF/HEIC dynamic wallpaper files used in MacOS. Support for all s

Bazyli Cyran 15 Dec 15, 2022
AI-powered game engine for dynamic, personalized experiences in evolving worlds. Ethical, accessible, inclusive.

ARCADIA: Advanced and Responsive Computational Architecture for Dynamic Interactive Ai: A Whitepaper By Reuven Cohen (rUv) Introduction Imagine a futu

rUv 10 Apr 18, 2023
Inspect dynamic dependencies of Mach-O binaries recursively

dylibtree dylibtree is a tool for inspecting the dynamic dependencies of a Mach-O binary recursively. It can be useful to understand what library load

Keith Smiley 53 Jul 3, 2023
A versatile and dynamic music bot designed to elevate the musical experience within Discord servers.

Masayoshi Masayoshi is a discord music bot written in Rust for making a great experience within Discord servers with support to Youtube, SoundCloud, S

null 6 Dec 26, 2023
Meta framework. Support for dynamic plug-ins and AOP

Kokoro Dynamic publish-subscribe pattern framework. Support for dynamic plug-ins and AOP Not yet stable, do not use in production !! ไธ‹้ข็š„ๅ†…ๅฎนๆœ‰ไบ›่€ๆ—งไบ†๏ผŒไฝ†ๆ˜ฏ exa

Kokoro 18 Mar 1, 2024
Rust API Server: A versatile template for building RESTful interfaces, designed for simplicity in setup and configuration using the Rust programming language.

RUST API SERVER Introduction Welcome to the Rust API Server! This server provides a simple REST interface for your applications. This README will guid

Harry Nguyen 3 Feb 25, 2024
A Text User Interface library for the Rust programming language

Cursive Cursive is a TUI (Text User Interface) library for rust. It uses ncurses by default, but other backends are available. It allows you to build

Alexandre Bury 3.3k Jan 9, 2023
๐ŸŽ„My Advent of Code 2021 solutions in the Rust programming language

Advent of Code 2021 in Rust My Advent of Code 2021 solutions in the Rust programming language. This repository holds a separate Rust project for each

Tim Visรฉe 227 Dec 16, 2022
A Text User Interface library for the Rust programming language

Cursive Cursive is a TUI (Text User Interface) library for rust. It uses ncurses by default, but other backends are available. It allows you to build

Alexandre Bury 3.3k Jan 3, 2023
Notes on learning the Rust programming language syntax.

notes-on-rust Notes on learning the Rust programming language syntax. Resources https://www.rust-lang.org/learn/get-started https://doc.rust-lang.org/

Fred Snyder 1 Jan 2, 2022