Crate bedquilt_io

Source
Expand description

This crate provides a safe, idiomatic, mid-level abstraction over Glk and other system facilities that are available from within the Glulx virtual machine. You can write Rust code which targets Glulx by depending on this crate, compiling for wasm32-unknown-unknown, and then using Wasm2Glulx to generate a Glulx story file.

You can think of bedquilt-io (alongside core, alloc, and hashbrown) as your substitute for std when developing for Glulx. Rust does already have a std crate for wasm32-unknown-unknown, but it is mostly useless: almost everything in it just panics or returns an Unimplemented error. If you want to use it anyway, you will need to disable this crate’s panic_handler and global_allocator features to prevent conflict with the ones that std provides. It is recommended, however, to make your program no_std, as bedquilt-io should already provide everything you need.

In the future, bedquilt-io will also support native compilation, using a pure-Rust implementation of the RemGlk protocol. However, this is not yet implemented, and this crate will fail to compile on for target other than wasm32-unknown-unknown. References in this documentation to behavior on “other platforms” should be understood in the future tense.

bedquilt-io is implemented around an included async executor. Your program’s glulx_main function should use task::spawn to start one or more asynchronous tasks, and then call task::run to run them all to completion. One of your tasks can then create a root window (typically a TextBufferWindow) using win::Window::create_as_root and use the traits it implements to perform IO asynchronously. A trivial program which reads keyboard input in a loop and echoes it back looks like this:

#![no_std]
#![no_main]
 
use bedquilt_io::win::{LineInput, TextBufferWindow, Window};
use core::fmt::Write;

#[no_mangle]
extern "C" fn glulx_main() {
    bedquilt_io::task::spawn(main());
    bedquilt_io::task::run();   
}

async fn main() {
    let mut root = TextBufferWindow::create_as_root().unwrap();
    loop {
        let input = root.request_line("").unwrap().await;
        writeln!(root, "{}", input.input).unwrap();
    }
}

Glk requires programs to query for a “gestalt” before attempting to use certain optional features. In Bedquilt, this is not necessary. If you want to do something possibly-unsupported, just try it, and if the necessary gestalt is missing you’ll get back Error::Unsupported.

Modules§

error
Error types.
fs
Filesystem and resource access.
random
Random number generation.
sound
Sound.
sync
Synchronization primitives.
task
Spawn and run tasks (a.k.a. green threads).
time
Time and timers.
win
Window management and user interaction.

Functions§

exit
Exits the program.