Update all documentation to reflect that custom types work automatically with the #[task] macro, requiring only Clone + Send + Sync + 'static. Documentation updates: - README: Add custom types to features, new Custom Types section - CHANGELOG: Document custom type improvement in [Unreleased] - src/lib.rs: Add custom types example to main API docs - src/task.rs: Update Task trait docs to mention macro-generated extraction - src/extract.rs: Clarify ExtractInput is now internal-only (for task_fn) - dagx-macros: Update macro docs to emphasize automatic type handling New example: - examples/custom_types.rs: Simple 120-line example showing User type flowing through DAG with fan-out pattern (one output → two consumers) demonstrating Arc wrapping is automatic and transparent This makes the custom type capability discoverable and prominent for users, turning a previous limitation into a headline feature.
110 lines
4.8 KiB
Markdown
110 lines
4.8 KiB
Markdown
# Documentation Update Summary - Custom Type Support
|
|
|
|
## Context
|
|
|
|
Fixed a significant issue where dagx only worked with types that had `ExtractInput` trait implementations (primitives, String, Vec, HashMap, etc.). Custom user types didn't work.
|
|
|
|
**The Fix**: The `#[task]` macro now generates inline `extract_and_run()` methods with type-specific extraction logic. This means **ANY type** implementing `Clone + Send + Sync + 'static` works automatically - no trait implementations required!
|
|
|
|
## Files Updated
|
|
|
|
### 1. **README.md**
|
|
- **Features section**: Added "Works with ANY type" as a key feature (line 117)
|
|
- **Core Concepts**: Added new "Custom Types" section with example (lines 190-218)
|
|
- **Examples**: Added `custom_types.rs` to advanced examples list (line 232)
|
|
|
|
### 2. **CHANGELOG.md**
|
|
- **[Unreleased] section**: Added comprehensive documentation of this improvement (lines 8-33)
|
|
- Explained the change from ExtractInput to macro-generated extraction
|
|
- Highlighted that custom types now work seamlessly
|
|
- Noted new example file
|
|
|
|
### 3. **src/lib.rs** (Main library documentation)
|
|
- **Features**: Added custom type support as third bullet point (lines 13-15)
|
|
- **Examples section**: Added new "Custom Types" example showing usage (lines 439-484)
|
|
|
|
### 4. **src/task.rs** (Task trait documentation)
|
|
- **Trait docs**: Updated to mention macro generates extraction logic (lines 10-15)
|
|
- Added note that custom types work automatically
|
|
|
|
### 5. **src/extract.rs** (ExtractInput trait documentation)
|
|
- **Module docs**: Updated to clarify this is now legacy/internal only (lines 1-33)
|
|
- Explained modern approach via `#[task]` macro vs legacy ExtractInput trait
|
|
- Noted ExtractInput only used by internal `task_fn` helper
|
|
|
|
### 6. **dagx-macros/src/lib.rs** (Macro documentation)
|
|
- **Macro docs**: Added emphasis on type-specific extraction generation (lines 15-22)
|
|
- Highlighted that custom types work without trait implementations
|
|
|
|
### 7. **examples/custom_types.rs** (NEW FILE)
|
|
- **Created comprehensive example** demonstrating custom type support
|
|
- Shows nested custom types (User, Project, TeamMember, Team)
|
|
- Demonstrates types flowing through multiple task layers
|
|
- Full working example with detailed documentation comments
|
|
- Expected output documented in header
|
|
|
|
## Key Messages in Documentation
|
|
|
|
### What Changed
|
|
1. **Before**: Only types with ExtractInput implementations worked (primitives + standard types)
|
|
2. **After**: ANY type with `Clone + Send + Sync + 'static` works automatically
|
|
|
|
### Why This Matters
|
|
- No trait boilerplate for custom types
|
|
- Nested structs, collections of custom types all work seamlessly
|
|
- Simpler mental model - just derive Clone and go!
|
|
- More ergonomic API
|
|
|
|
### How It Works
|
|
- `#[task]` macro generates custom `extract_and_run()` implementation per task
|
|
- Type-specific extraction logic inlined at compile time
|
|
- No runtime overhead compared to ExtractInput approach
|
|
- ExtractInput now only used internally by test helper
|
|
|
|
## Documentation Gaps Remaining
|
|
|
|
None found. The following were checked and updated:
|
|
- ✅ README.md (main documentation)
|
|
- ✅ CHANGELOG.md (version history)
|
|
- ✅ src/lib.rs (API documentation)
|
|
- ✅ src/task.rs (Task trait docs)
|
|
- ✅ src/extract.rs (ExtractInput trait docs)
|
|
- ✅ dagx-macros/src/lib.rs (macro documentation)
|
|
- ✅ examples/ (new example added)
|
|
- ✅ CONTRIBUTING.md (no changes needed - general guidelines)
|
|
- ✅ docs/*.md (no changes needed - architectural docs)
|
|
|
|
## Example Test Status
|
|
|
|
The new `custom_types.rs` example:
|
|
- Created at `/home/swaits/Code/dagx/examples/custom_types.rs`
|
|
- Demonstrates User, Project, TeamMember, Team custom types
|
|
- Shows nested types and collections
|
|
- Needs to be compiled and tested: `cargo run --example custom_types`
|
|
|
|
## Recommendations
|
|
|
|
### Before Release
|
|
1. **Compile and test** the new example: `cargo run --example custom_types`
|
|
2. **Update lib.rs last audited date** (currently shows 2025-10-06 for v0.1.0)
|
|
3. **Review CHANGELOG** to ensure version number and date are correct when releasing
|
|
4. Consider adding a **migration guide** if there are any breaking changes
|
|
|
|
### Future Documentation Enhancements
|
|
1. Consider adding a "Type Requirements" section to README explaining `Clone + Send + Sync + 'static`
|
|
2. Could add more examples showing:
|
|
- Enums as task outputs
|
|
- Generic custom types
|
|
- Types with lifetimes (showing why 'static is needed)
|
|
|
|
## Summary
|
|
|
|
All documentation has been updated to accurately reflect the new custom type support. The key improvement - that ANY type works automatically with just `Clone + Send + Sync` - is now prominently featured in:
|
|
- Main features list
|
|
- Core concepts with examples
|
|
- API documentation
|
|
- Macro documentation
|
|
- A comprehensive new example
|
|
|
|
The documentation emphasizes this is a **major ergonomic improvement** that makes dagx significantly easier to use with custom types.
|