plotline 0.2.0

Engine-independent sequences with branching, subroutines, and external waits
Documentation
  • Coverage
  • 100%
    181 out of 181 items documented8 out of 50 items with examples
  • Size
  • Source code size: 166.56 kB This is the summed size of all the files inside the crates.io package for this release.
  • Documentation size: 4.06 MB This is the summed size of all files generated by rustdoc for all configured targets
  • Ø build duration
  • this release: 2s Average build duration of successful builds.
  • all releases: 2s Average build duration of successful builds in releases after 2024-10-23.
  • Links
  • dp88/plotline
    1 0 0
  • crates.io
  • Dependencies
  • Versions
  • Owners
  • dp88

plotline banner

plotline

CI crates.io docs.rs MSRV license

Branching sequences of events as plain data — dialog, quests, cutscenes, tutorials — for any engine. The host defines the steps; plotline runs order, branches, subroutines, jumps, and waits.

Quick start

[dependencies]
plotline = "0.2"
use core::task::Poll;
use plotline::{Completion, Library, Outcome, Runner, Sequence, TypeMap, steps};

let ready = Completion::new();
let waiting_on = ready.clone();

let mut library = Library::new();
let farewell = library.insert(
    Sequence::new("farewell")
        .with_step(steps::run("Say goodbye", |_ctx| println!("Safe roads."))),
);
let greeting = library.insert(
    Sequence::new("greeting")
        .with_step(steps::run("Say hello", |_ctx| println!("Hello, traveler.")))
        .with_step(steps::run("Wait for the world", move |_ctx| waiting_on.clone()))
        .with_step(steps::Branch {
            condition: None,
            if_true: Some(farewell),
            if_false: None,
        }),
);

let mut runner = Runner::default();
let mut services = TypeMap::new();
runner.start(greeting, None).unwrap();

assert_eq!(runner.advance(&mut library, &mut services), Poll::Pending);

ready.signal();
assert_eq!(
    runner.advance(&mut library, &mut services),
    Poll::Ready(Outcome::Finished),
);

Why

  • Plain data. A sequence is an ordered list of steps the host defines — closures for the simple cases, structs where a step carries state.
  • Subroutines and jumps. Call enters a subroutine and falling off its end returns to the caller; Return exits early; Goto clears the whole call chain before starting its target.
  • No clock. A waiting step returns a Completion handle. The host signals it and calls advance(). The crate does not define timed waits.
  • No engine or runtime dependencies. no_std with alloc; the default std feature adds panic isolation only.
  • Tooling-ready. Whole-library validation, per-step reference facts, and reachability analysis feed editors and linters.

Requirements and features

  • Rust 1.85 or later, edition 2024.
  • no_std with alloc; no required dependencies.
  • std (default): catches panics in steps. It requires panic = "unwind".
  • --no-default-features builds without std and does not catch panics.

More examples and documentation

License

Licensed under either of Apache License, Version 2.0 or MIT license at your option.

Banner artwork: “Subway” (1934) by Lily Furedi, via Wikimedia Commons. The digital image is credited to the Smithsonian American Art Museum; the file is marked public domain.