diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ab85f3f..083ffcc 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -15,7 +15,7 @@ jobs: profile: [no-default-features, alloc, std, spsc_raw] steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Setup Rust uses: dtolnay/rust-toolchain@v1 @@ -23,7 +23,7 @@ jobs: toolchain: stable - name: Cache cargo registry - uses: actions/cache@v4 + uses: actions/cache@v5 with: path: | ~/.cargo/registry @@ -36,30 +36,40 @@ jobs: - name: Rustfmt check run: cargo fmt --all -- --check - - name: Build, test & clippy (no-default-features) + - name: Build, test, clippy & doc (no-default-features) if: matrix.profile == 'no-default-features' run: | cargo build --all --no-default-features --all-targets --verbose cargo test --all --no-default-features --all-targets --verbose cargo clippy --all --no-default-features -- -D warnings + RUSTDOCFLAGS="-D warnings" cargo doc --workspace --no-deps --no-default-features - - name: Build, test & clippy (alloc) + - name: Build, test, clippy & doc (alloc) if: matrix.profile == 'alloc' run: | cargo build --all --features alloc --all-targets --verbose cargo test --all --features alloc --all-targets --verbose cargo clippy --all --features alloc -- -D warnings + RUSTDOCFLAGS="-D warnings" cargo doc --workspace --no-deps --features alloc - - name: Build, test & clippy (std) + - name: Build, test, clippy & doc (std) if: matrix.profile == 'std' run: | cargo build --all --features std --all-targets --verbose cargo test --all --features std --all-targets --verbose cargo clippy --all --features std -- -D warnings + RUSTDOCFLAGS="-D warnings" cargo doc --workspace --no-deps --features std - - name: Build, test & clippy (spsc_raw) + - name: Build, test, clippy & doc (spsc_raw) if: matrix.profile == 'spsc_raw' run: | cargo build --all --features spsc_raw --all-targets --verbose cargo test --all --features spsc_raw --all-targets --verbose cargo clippy --all --features spsc_raw -- -D warnings + RUSTDOCFLAGS="-D warnings" cargo doc --workspace --no-deps --features spsc_raw + + deny: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v5 + - uses: EmbarkStudios/cargo-deny-action@v2 diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml new file mode 100644 index 0000000..9232a49 --- /dev/null +++ b/.github/workflows/docs.yml @@ -0,0 +1,49 @@ +name: Docs + +on: + push: + branches: + - main + +permissions: + contents: read + pages: write + id-token: write + +concurrency: + group: pages + cancel-in-progress: true + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v5 + + - name: Setup Rust + uses: dtolnay/rust-toolchain@v1 + with: + toolchain: stable + + - name: Build documentation + run: cargo doc --workspace --no-deps --all-features + + - name: Add redirect index + run: echo '' > target/doc/index.html + + - name: Upload artifact + uses: actions/upload-pages-artifact@v4 + with: + path: target/doc + + deploy: + needs: build + runs-on: ubuntu-latest + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + steps: + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v5 diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..875adfa --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,38 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/), +and this project adheres to [Semantic Versioning](https://semver.org/). + +> **Note:** Limen is in alpha. APIs may change before v0.1.0. + +## [0.1.0-alpha.1] — 2026-04-08 + +### Added + +- **limen-core:** Core contract layer — traits and types for edges, nodes, + messages, policies, graph API, telemetry, scheduling, memory management, + platform clocks, and runtime lifecycle. +- **limen-core:** Multiple SPSC queue implementations (`SpscArrayQueue`, + `SpscVecDeque`, `SpscRingbufQueue`, `SpscConcurrentQueue`, `SpscPriority2`) + with shared conformance test suite. +- **limen-core:** Token-based zero-copy memory model with three manager + implementations (`StaticMemoryManager`, `HeapMemoryManager`, + `ConcurrentMemoryManager`). +- **limen-core:** `Tensor` and `Batch` message payload types with shape, + stride, and quantization support. +- **limen-core:** `GraphTelemetry` with fixed-buffer and I/O writer sinks. +- **limen-core:** `NoStdLinuxMonotonicClock` platform clock implementation. +- **limen-core:** Source, Sink, and InferenceModel node adapter traits. +- **limen-codegen:** Graph builder API and DSL parser for declarative graph + definitions. +- **limen-codegen:** Full graph validation (contiguous indices, port counts, + payload type matching, queue type consistency). +- **limen-codegen:** Code generator emitting fully-typed `no_std` graph structs + with optional `std`-only concurrent graph module. +- **limen-build:** `define_graph!` proc-macro wrapper for `limen-codegen`. +- **limen-runtime:** Skeleton runtime and scheduler module structure. +- **limen-platform:** Skeleton Linux platform adapter module. +- **limen-examples:** Integration tests exercising hand-written, codegen, and + proc-macro graph definitions across `no_std` and `std` feature variants. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 66fe8d7..ab2031d 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -7,11 +7,10 @@ to contribute and the terms under which contributions are accepted. ## Getting Started -Limen is currently in pre-release development. The repository will be made -public alongside the v0.1.0 release. +Limen is in alpha. The repository is public and contributions are welcome. -If you are interested in early access, collaboration, or have a use case you -would like to discuss, please open an issue or reach out directly. +If you have a use case you would like to discuss or would like to collaborate, +please open an issue or reach out directly. ### Development Setup diff --git a/Cargo.toml b/Cargo.toml index 58fa862..cc8cbae 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,11 +12,15 @@ resolver = "2" [workspace.package] edition = "2021" +rust-version = "1.81" license = "Apache-2.0" -license-file = "LICENSE-APACHE" authors = ["Arlo Louis Byrne (idky137) "] repository = "https://github.com/idky137/limen" +homepage = "https://github.com/idky137/limen" +documentation = "https://docs.rs/limen-core" readme = "README.md" +keywords = ["embedded", "inference", "runtime", "no-std", "graph"] +categories = ["embedded", "no-std::no-alloc", "science::robotics"] [workspace.dependencies] # Internal crates diff --git a/README.md b/README.md index b838546..0c2b391 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,9 @@ # Limen +[![CI](https://github.com/idky137/limen/actions/workflows/ci.yml/badge.svg)](https://github.com/idky137/limen/actions/workflows/ci.yml) +[![License](https://img.shields.io/badge/license-Apache--2.0-blue.svg)](LICENSE-APACHE) +[![MSRV](https://img.shields.io/badge/MSRV-1.81-blue.svg)](#) + > **Portable, contract-enforcing computation graphs for AI-enabled embedded > systems — from bare-metal microcontrollers to multi-threaded servers, in > safe Rust.** @@ -203,6 +207,7 @@ beyond. | Document | Description | |---|---| +| [API Reference](https://idky137.github.io/limen/) | Rustdoc API documentation (GitHub Pages) | | [Architecture Guide](docs/architecture/index.md) | System design, memory model, execution flow | | [Decision Records](docs/ADRs/) | Rationale behind key design decisions | | [Roadmap](docs/roadmap.md) | Phased plan to v0.1.0 and stretch goals | diff --git a/deny.toml b/deny.toml new file mode 100644 index 0000000..27df219 --- /dev/null +++ b/deny.toml @@ -0,0 +1,22 @@ +[advisories] +db-path = "~/.cargo/advisory-db" +db-urls = ["https://github.com/rustsec/advisory-db"] + +[licenses] +allow = [ + "Apache-2.0", + "MIT", + "Unlicense", + "Unicode-3.0", +] +# ringbuf uses non-standard SPDX "MIT/Apache-2.0" — cargo-deny needs an exception: +exceptions = [ + { allow = ["MIT", "Apache-2.0"], crate = "ringbuf" }, +] + +[bans] +multiple-versions = "warn" + +[sources] +unknown-registry = "deny" +unknown-git = "deny" diff --git a/dev_utils/run-local-ci.sh b/dev_utils/run-local-ci.sh index 1330ed2..9e3e2ae 100755 --- a/dev_utils/run-local-ci.sh +++ b/dev_utils/run-local-ci.sh @@ -14,6 +14,7 @@ # * std # * spsc_raw # - clippy for the same feature sets (unless `--no-clippy-or-fmt` is set) +# - cargo doc with -D warnings (unless `--no-clippy-or-fmt` is set) # # Options: # --clean Run `cargo clean` after all CI checks pass @@ -77,8 +78,11 @@ cargo test --all --no-default-features --all-targets --verbose if [ "$SKIP_CLIPPY_AND_FMT" = false ]; then printf " -> cargo clippy --all --no-default-features -- -D warnings\n" cargo clippy --all --no-default-features -- -D warnings + printf " -> RUSTDOCFLAGS="-D warnings" cargo doc --workspace --no-deps --no-default-features" + RUSTDOCFLAGS="-D warnings" cargo doc --workspace --no-deps --no-default-features else printf " -> clippy skipped (--no-clippy-or-fmt)\n" + printf " -> doc check skipped (--no-clippy-or-fmt)\n\n" fi printf "\n" @@ -90,8 +94,11 @@ cargo test --all --features alloc --all-targets --verbose if [ "$SKIP_CLIPPY_AND_FMT" = false ]; then printf " -> cargo clippy --all --features alloc -- -D warnings\n" cargo clippy --all --features alloc -- -D warnings + printf " -> RUSTDOCFLAGS="-D warnings" cargo doc --workspace --no-deps --features alloc" + RUSTDOCFLAGS="-D warnings" cargo doc --workspace --no-deps --features alloc else printf " -> clippy skipped (--no-clippy-or-fmt)\n" + printf " -> doc check skipped (--no-clippy-or-fmt)\n\n" fi printf "\n" @@ -103,8 +110,11 @@ cargo test --all --features std --all-targets --verbose if [ "$SKIP_CLIPPY_AND_FMT" = false ]; then printf " -> cargo clippy --all --features std -- -D warnings\n" cargo clippy --all --features std -- -D warnings + printf " -> RUSTDOCFLAGS="-D warnings" cargo doc --workspace --no-deps --features std" + RUSTDOCFLAGS="-D warnings" cargo doc --workspace --no-deps --features std else printf " -> clippy skipped (--no-clippy-or-fmt)\n" + printf " -> doc check skipped (--no-clippy-or-fmt)\n\n" fi printf "\n" @@ -116,8 +126,11 @@ cargo test --all --features spsc_raw --all-targets --verbose if [ "$SKIP_CLIPPY_AND_FMT" = false ]; then printf " -> cargo clippy --all --features spsc_raw -- -D warnings\n" cargo clippy --all --features spsc_raw -- -D warnings + printf " -> RUSTDOCFLAGS="-D warnings" cargo doc --workspace --no-deps --features spsc_raw" + RUSTDOCFLAGS="-D warnings" cargo doc --workspace --no-deps --features spsc_raw else printf " -> clippy skipped (--no-clippy-or-fmt)\n" + printf " -> doc check skipped (--no-clippy-or-fmt)\n\n" fi printf "\n" @@ -127,7 +140,7 @@ if [ "$SKIP_CLIPPY_AND_FMT" = false ]; then cargo fmt --all -- --check printf "\n" else - printf "==> rustfmt skipped (--no-clippy-or-fmt)\n\n" + printf "==> rustfmt skipped (--no-clippy-or-fmt)\n" fi printf "==> local CI passed\n\n" diff --git a/limen-build/Cargo.toml b/limen-build/Cargo.toml index b4474c4..ea47689 100644 --- a/limen-build/Cargo.toml +++ b/limen-build/Cargo.toml @@ -3,10 +3,19 @@ name = "limen-build" description = "Proc-macro wrapper for limen-codegen." version = "0.1.0-alpha.1" edition.workspace = true +rust-version.workspace = true license.workspace = true -license-file.workspace = true repository.workspace = true +homepage.workspace = true +documentation = "https://docs.rs/limen-build" +readme.workspace = true authors.workspace = true +keywords.workspace = true +categories.workspace = true + +[package.metadata.docs.rs] +all-features = true +rustdoc-args = ["--cfg", "docsrs"] [lib] proc-macro = true diff --git a/limen-codegen/Cargo.toml b/limen-codegen/Cargo.toml index 53f53ba..0ae8613 100644 --- a/limen-codegen/Cargo.toml +++ b/limen-codegen/Cargo.toml @@ -3,10 +3,19 @@ name = "limen-codegen" description = "Reusable code generator for Limen graphs (proc-macro and build.rs compatible)." version = "0.1.0-alpha.1" edition.workspace = true +rust-version.workspace = true license.workspace = true -license-file.workspace = true repository.workspace = true +homepage.workspace = true +documentation = "https://docs.rs/limen-codegen" +readme.workspace = true authors.workspace = true +keywords.workspace = true +categories.workspace = true + +[package.metadata.docs.rs] +all-features = true +rustdoc-args = ["--cfg", "docsrs"] [dependencies] limen-core = { workspace = true } diff --git a/limen-codegen/src/builder.rs b/limen-codegen/src/builder.rs index ee8d7bb..1262d1d 100644 --- a/limen-codegen/src/builder.rs +++ b/limen-codegen/src/builder.rs @@ -2,7 +2,7 @@ //! (no proc-macro input and no stringly-typed DSL). //! //! Use this from your crate’s `build.rs` to construct a -//! [`crate::ast::GraphDef`] with ordinary Rust types and expressions +//! `crate::ast::GraphDef` with ordinary Rust types and expressions //! (typically authored via `syn::parse_quote!`). Then pass the finished AST to //! `expand_ast_to_file(..)` to emit the generated graph implementation. //! diff --git a/limen-codegen/src/lib.rs b/limen-codegen/src/lib.rs index c970269..19e56cf 100644 --- a/limen-codegen/src/lib.rs +++ b/limen-codegen/src/lib.rs @@ -332,7 +332,7 @@ pub enum CodegenError { Pretty(String), } -/// Validate and emit Rust code from a typed [`ast::GraphDef`]. +/// Validate and emit Rust code from a typed `ast::GraphDef`. /// /// This is the low-level entry used by [`builder::GraphBuilder`] after it has /// constructed the AST programmatically. The graph is validated before emission; @@ -462,7 +462,7 @@ pub fn expand_str_to_file>(spec: &str, dest: P) -> Result`] / [`GraphEdgeAccess`] — compile-time indexed access. //! - [`GraphNodeTypes`] — per-node payload and queue type associations. -//! - [`GraphNodeContextBuilder`] — factory for [`StepContext`](crate::node::StepContext). +//! - [`GraphNodeContextBuilder`] — factory for [`StepContext`]. //! //! Submodules: -//! - [`validate`] — [`GraphValidator`](validate::GraphValidator) and [`GraphDescBuf`](validate::GraphDescBuf) for descriptor validation. -//! - [`bench`] — test graphs (`bench` / `test` feature). +//! - [`validate`] — [`GraphValidator`] and [`GraphDescBuf`] for descriptor validation. +//! - `bench` — test graphs (`bench` / `test` feature). pub mod validate; @@ -385,7 +385,7 @@ pub type EdgeOccupancyBuf = [EdgeOccupancy; E]; /// # Edge and manager handles /// /// Edges must implement [`ScopedEdge`](crate::edge::ScopedEdge) and managers -/// must implement [`ScopedManager`](crate::memory::ScopedManager) to produce +/// must implement [`ScopedManager`](crate::memory::manager::ScopedManager) to produce /// per-worker handles. Arc-based types (e.g. `ConcurrentEdge`, /// `ConcurrentMemoryManager`) return clones; future lock-free types will /// return split producer/consumer handles via diff --git a/limen-core/src/memory.rs b/limen-core/src/memory.rs index e7a8fdb..5f90bba 100644 --- a/limen-core/src/memory.rs +++ b/limen-core/src/memory.rs @@ -12,8 +12,8 @@ //! - [`header_store`] — [`HeaderStore`](header_store::HeaderStore) supertrait for payload-agnostic header access. //! - [`manager`] — [`MemoryManager`](manager::MemoryManager) typed storage interface. //! - [`static_manager`] — `no_std`/`no_alloc` fixed-capacity implementation. -//! - [`heap_manager`] (`alloc`) — heap-backed fixed-capacity implementation. -//! - [`concurrent_manager`] (`std`) — lock-free freelist + per-slot `RwLock` implementation. +//! - `heap_manager` (`alloc`) — heap-backed fixed-capacity implementation. +//! - `concurrent_manager` (`std`) — lock-free freelist + per-slot `RwLock` implementation. pub mod header_store; pub mod manager; @@ -207,7 +207,7 @@ impl PlacementAcceptance { /// A descriptor of a buffer/payload view for size accounting. /// -/// Memory class information is now owned by the [`MemoryManager`] rather than +/// Memory class information is now owned by the [`manager::MemoryManager`] rather than /// the payload itself — see `MemoryManager::memory_class()`. #[non_exhaustive] #[derive(Debug, Clone, Copy, PartialEq, Eq)] diff --git a/limen-core/src/memory/manager.rs b/limen-core/src/memory/manager.rs index 5153a71..1796f61 100644 --- a/limen-core/src/memory/manager.rs +++ b/limen-core/src/memory/manager.rs @@ -26,7 +26,7 @@ //! - [`MemoryManager::memory_class`] //! //! Shared header access is provided separately through the -//! [`HeaderStore`](crate::memory::header_store::HeaderStore) supertrait. +//! [`HeaderStore`] supertrait. //! //! # Guard-based borrows //! @@ -204,7 +204,7 @@ pub trait MemoryManager: HeaderStore { /// - [`MemoryError::BadToken`] if `token` is invalid; /// - [`MemoryError::NotAllocated`] if the slot is already empty; /// - [`MemoryError::BorrowActive`] if the slot still has active borrows; - /// - [`MemoryError::QueueOwned`] if the implementation tracks queue + /// - `MemoryError::QueueOwned` if the implementation tracks queue /// ownership internally and the token is still considered live in one or /// more queues; /// - [`MemoryError::Poisoned`] if a concurrent implementation encounters a diff --git a/limen-core/src/message.rs b/limen-core/src/message.rs index fe7304a..4a21de8 100644 --- a/limen-core/src/message.rs +++ b/limen-core/src/message.rs @@ -11,8 +11,8 @@ //! //! Submodules: //! - [`payload`] — the [`Payload`] trait and blanket impls for slices/arrays/scalars. -//! - [`tensor`] — owned, fixed-capacity, `no_std`/`no_alloc` [`Tensor`] type. -//! - [`batch`] — [`Batch`] view, [`BatchView`] container, and [`BatchMessageIter`]. +//! - [`tensor`] — owned, fixed-capacity, `no_std`/`no_alloc` [`Tensor`](tensor::Tensor) type. +//! - [`batch`] — [`Batch`](batch::Batch) view, [`BatchView`](batch::BatchView) container, and [`BatchMessageIter`](batch::BatchMessageIter). pub mod batch; pub mod payload; diff --git a/limen-core/src/message/tensor.rs b/limen-core/src/message/tensor.rs index 5802359..81d1310 100644 --- a/limen-core/src/message/tensor.rs +++ b/limen-core/src/message/tensor.rs @@ -6,7 +6,7 @@ //! how many of the `N` slots are in use; the shape array `[usize; R]` records //! the logical dimensions. //! -//! Use [`TensorRef`] for a borrowed, zero-copy view into an existing +//! Use `&Tensor` for a borrowed, zero-copy view into an existing //! buffer (e.g. a frame from a DMA ring). use core::mem; diff --git a/limen-core/src/node.rs b/limen-core/src/node.rs index 395eefe..8545618 100644 --- a/limen-core/src/node.rs +++ b/limen-core/src/node.rs @@ -15,9 +15,9 @@ //! Submodules: //! - [`source`] — [`SourceNode`](source::SourceNode) trait for 0-input nodes. //! - [`sink`] — [`SinkNode`](sink::SinkNode) trait for 0-output nodes. -//! - [`model`] — [`ModelNode`](model::ModelNode) trait for inference nodes. -//! - [`link`] — [`NodeLink`] and [`NodeDescriptor`](link::NodeDescriptor) wiring helpers. -//! - [`bench`] — test nodes (`bench` / `test` feature). +//! - [`model`] — [`InferenceModel`](model::InferenceModel) adapter for inference nodes. +//! - [`link`] — [`NodeLink`](link::NodeLink) and [`NodeDescriptor`](link::NodeDescriptor) wiring helpers. +//! - `bench` — test nodes (`bench` / `test` feature). pub mod link; pub mod model; diff --git a/limen-core/src/prelude.rs b/limen-core/src/prelude.rs index 8e1c9f1..9229fbe 100644 --- a/limen-core/src/prelude.rs +++ b/limen-core/src/prelude.rs @@ -3,12 +3,13 @@ //! Importing `limen_core::prelude::*` brings all public surface into scope, //! gated by the same feature flags as the source modules: //! -//! - (default / `no_std`) — [`Edge`], [`SpscArrayQueue`], [`StaticMemoryManager`], -//! [`Tensor`], [`Batch`], [`Node`], [`GraphApi`], [`PlatformClock`], policy types, etc. -//! - `alloc` — [`HeapMemoryManager`], [`SpscVecDeque`]. -//! - `std` — [`ConcurrentMemoryManager`], [`ConcurrentEdge`], [`ScopedEdge`], -//! [`ScopedGraphApi`], concurrent telemetry. -//! - `spsc_raw` — [`SpscRawQueue`]. +//! - (default / `no_std`) — [`Edge`], [`StaticRing`], [`StaticMemoryManager`], +//! [`Tensor`], [`Batch`], [`Node`], [`GraphApi`], +//! [`PlatformClock`], policy types, etc. +//! - `alloc` — `HeapMemoryManager`, `HeapRing`. +//! - `std` — `ConcurrentMemoryManager`, `ConcurrentEdge`, `ScopedEdge`, +//! `ScopedGraphApi`, concurrent telemetry. +//! - `spsc_raw` — `SpscAtomicRing`. //! - `bench` / `test` — test nodes, test edges, test graph, test runtime. pub use crate::edge::{ diff --git a/limen-core/src/runtime.rs b/limen-core/src/runtime.rs index ecfb41f..91a7f11 100644 --- a/limen-core/src/runtime.rs +++ b/limen-core/src/runtime.rs @@ -4,7 +4,7 @@ //! It owns a clock and telemetry after [`LimenRuntime::init`] and drives //! execution through [`LimenRuntime::step`] / [`LimenRuntime::run`]. //! -//! [`RuntimeStopHandle`] (`std` only) allows cooperative stop requests from +//! `RuntimeStopHandle` (`std` only) allows cooperative stop requests from //! outside the runtime loop (e.g. from another thread). #[cfg(any(test, feature = "bench"))] diff --git a/limen-core/src/telemetry/event_message.rs b/limen-core/src/telemetry/event_message.rs index 774a4c4..bf3c59e 100644 --- a/limen-core/src/telemetry/event_message.rs +++ b/limen-core/src/telemetry/event_message.rs @@ -6,7 +6,7 @@ //! newline characters. Violations detected in a `const` context produce //! compile-time errors. //! -//! The accompanying [`event_message!`] macro guarantees that all validation +//! The accompanying `event_message!` macro guarantees that all validation //! happens during compilation, even when invoked inside non-const functions. //! When compiled successfully, an `EventMessage` is represented and used at //! runtime with **no overhead**, making it as efficient as a bare `&'static str`. @@ -27,7 +27,7 @@ /// - The message must not exceed [`EventMessage::MAX_LEN`] bytes. /// - The message must not contain newline characters (`'\n'` or `'\r'`). /// -/// When constructed using the accompanying [`event_message!`] macro, all +/// When constructed using the accompanying `event_message!` macro, all /// validation is **guaranteed to occur at compile time**, ensuring: /// /// - **Zero runtime cost** (no loops, no checks, no panics). @@ -52,9 +52,9 @@ /// - Using `EventMessage::new` inside a `const` context performs validation at /// compile time. /// - Using `EventMessage::new` at runtime may incur runtime checking cost. -/// - Using the [`event_message!`] macro **always** validates at compile time. +/// - Using the `event_message!` macro **always** validates at compile time. /// -/// Prefer [`event_message!`] for maximal performance and strictness. +/// Prefer `event_message!` for maximal performance and strictness. /// /// # Examples /// @@ -129,7 +129,7 @@ impl EventMessage { /// - Validation executes at runtime. /// - Violations cause a runtime panic. /// - /// For most usage, the [`event_message!`] macro ensures compile-time + /// For most usage, the `event_message!` macro ensures compile-time /// validation in all cases. pub const fn new(s: &'static str) -> Self { let bytes = s.as_bytes(); diff --git a/limen-core/src/types.rs b/limen-core/src/types.rs index 18cecc9..cbb02e9 100644 --- a/limen-core/src/types.rs +++ b/limen-core/src/types.rs @@ -251,7 +251,7 @@ impl EdgeIndex { // ***** Memory ***** -/// A lightweight handle to a message stored in a [`MemoryManager`]. +/// A lightweight handle to a message stored in a [`MemoryManager`](crate::memory::manager::MemoryManager). /// /// Edges carry `MessageToken` values instead of full `Message

` payloads. /// The token is an index into a manager's slot array. Tokens are `Copy`, diff --git a/limen-examples/Cargo.toml b/limen-examples/Cargo.toml index 28a4a14..b845dcf 100644 --- a/limen-examples/Cargo.toml +++ b/limen-examples/Cargo.toml @@ -3,8 +3,8 @@ name = "limen-examples" description = "Limen examples and integration tests." version = "0.1.0-alpha.1" edition.workspace = true +rust-version.workspace = true license.workspace = true -license-file.workspace = true repository.workspace = true authors.workspace = true diff --git a/limen-node/Cargo.toml b/limen-node/Cargo.toml index bdcc1dc..54841e3 100644 --- a/limen-node/Cargo.toml +++ b/limen-node/Cargo.toml @@ -3,10 +3,19 @@ name = "limen-node" description = "Limen node implementations." version = "0.1.0-alpha.1" edition.workspace = true +rust-version.workspace = true license.workspace = true -license-file.workspace = true repository.workspace = true +homepage.workspace = true +documentation = "https://docs.rs/limen-node" +readme.workspace = true authors.workspace = true +keywords.workspace = true +categories.workspace = true + +[package.metadata.docs.rs] +all-features = true +rustdoc-args = ["--cfg", "docsrs"] [features] default = [] diff --git a/limen-platform/Cargo.toml b/limen-platform/Cargo.toml index 2de0c6e..dc34c7e 100644 --- a/limen-platform/Cargo.toml +++ b/limen-platform/Cargo.toml @@ -3,10 +3,19 @@ name = "limen-platform" description = "Platform adapters for Limen." version = "0.1.0-alpha.1" edition.workspace = true +rust-version.workspace = true license.workspace = true -license-file.workspace = true repository.workspace = true +homepage.workspace = true +documentation = "https://docs.rs/limen-platform" +readme.workspace = true authors.workspace = true +keywords.workspace = true +categories.workspace = true + +[package.metadata.docs.rs] +all-features = true +rustdoc-args = ["--cfg", "docsrs"] [features] alloc = ["limen-core/alloc"] diff --git a/limen-runtime/Cargo.toml b/limen-runtime/Cargo.toml index 10a7029..26bb315 100644 --- a/limen-runtime/Cargo.toml +++ b/limen-runtime/Cargo.toml @@ -3,10 +3,19 @@ name = "limen-runtime" description = "Limen runtime implementations and schedulers." version = "0.1.0-alpha.1" edition.workspace = true +rust-version.workspace = true license.workspace = true -license-file.workspace = true repository.workspace = true +homepage.workspace = true +documentation = "https://docs.rs/limen-runtime" +readme.workspace = true authors.workspace = true +keywords.workspace = true +categories.workspace = true + +[package.metadata.docs.rs] +all-features = true +rustdoc-args = ["--cfg", "docsrs"] [features] default = []