Skip to content

Repository files navigation

tasktree

Crates.ioDocumentationCILicenseDownloads

Distributed task-tree values: W3C trace-compatible task identities under an application-supplied URN scheme, validated lifecycle transitions, parent-child lineage, progress, and timestamps.

This crate is deliberately runtime-independent — no async, no I/O, no executor. It is the value layer a distributed task engine is built on; the engine (registries, admission, execution, event streams) is yours.

  • Identity — a TaskTreeId is W3C trace-sized (16 bytes) and a TaskNodeId span-sized (8 bytes), so every task maps directly onto Trace Context: a tree id parses from its URN, a bare trace id, or a full traceparent header. Every tree has one reserved root node, and TaskId::child mints siblings inside the tree.
  • Your namespace, not ours — identities are minted under a UrnScheme the application defines; this crate ships no namespace of its own, so no third party can mint another system's URNs and two systems' identities can never be confused, even at the type level. Prefixes are validated at compile time.
  • LifecycleTaskStatus with a validated transition machine (admitted → queued → running → sealing → done/failed/cancelled); terminal states admit no exits, and the irreversible sealing region refuses cancellation. Illegal edges are unrepresentable as TaskTransition values.
  • LineageTaskLineage proves a parent-child edge is within one tree and never self-referential, enforced again on deserialization.
  • Progress — typed units, bounded aggregation, display fractions, and lifecycle timestamps.
use tasktree::{TaskId,TaskLineage,TaskStatus,UrnScheme};#[derive(Debug,Clone,Copy,PartialEq,Eq,Hash,PartialOrd,Ord)]structMyUrn;implUrnSchemeforMyUrn{constTASK_PREFIX:&'staticstr = "urn:my-app:task:";constTREE_PREFIX:&'staticstr = "urn:my-app:task-tree:";}let root:TaskId<MyUrn> = TaskId::generate();let child = root.child();assert!(root.as_str().starts_with("urn:my-app:task:"));let edge = TaskLineage::try_new(child, root).expect("same tree, not self");assert!(TaskStatus::Running.validate_transition(TaskStatus::Sealing).is_ok());
# let _ = edge;

Serde uses the URN string form throughout, and every deserialization re-validates: a foreign prefix, a zero identity, or an illegal transition never becomes a value.

License

Licensed under either of:

Links

About

Distributed task-tree values: W3C trace-compatible task identities under an application-supplied URN scheme, validated lifecycle, lineage, and progress

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Used by

Contributors

Languages