diff options
| author | 魏曹先生 <1992414357@qq.com> | 2026-06-28 03:51:37 +0800 |
|---|---|---|
| committer | 魏曹先生 <1992414357@qq.com> | 2026-06-28 03:51:37 +0800 |
| commit | caf2ec52437e16c42ebc1d826607c814ed7a889e (patch) | |
| tree | 70a961fdfe47cef511b5988a4856a80f382488ff /issues | |
| parent | 2585264de785057c1ca21284b88e25e3a2addb94 (diff) | |
docs(issues): add the-mod-pathfinder design issue
Diffstat (limited to 'issues')
| -rw-r--r-- | issues/the-mod-pathfinder.md | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/issues/the-mod-pathfinder.md b/issues/the-mod-pathfinder.md new file mode 100644 index 0000000..5a0a4da --- /dev/null +++ b/issues/the-mod-pathfinder.md @@ -0,0 +1,61 @@ +# The Mod Pathfinder + +## Background + +Currently, `gen_program!` requires all involved types to be `use`d within their module. Mingling lacks a complete module path analyzer — waiting for `proc-macro-span` to stabilize is clearly not practical, so a solution for obtaining module paths is needed. + +## Solution + +We plan to create an analyzer called `mingling-mod-pathf`, enabled via Mingling's `"pathf"` feature, to compute the full paths of all defined Mingling types. + +### Behavior When Enabled + +**`mingling_core`**: If the `builds` feature is enabled, introduces the `mingling::build::analyze_and_build_type_mapping()` method (analysis completed at Build-Time) + +**`mingling_macros`**: Modifies the behavior of the `gen_program!()` macro — automatically loads the mapping table from the analysis file generated by `mingling::build::analyze_and_build_type_mapping()`, and directly uses the full `mod::path` instead of `TypeName` (injected at Compile-Time) + +## Challenges + +`mingling-mod-pathf` needs to understand **all** Mingling syntax features. +Fortunately, Mingling's type creation is almost always explicit: + +```rust +mod sub { + mingling::macros::pack!(ResultMyName = String); // directly creates ..::sub::ResultMyName +} +``` + +There are a few exceptions, such as the implicit Dispatcher provided by `extra_macros`, but these can be inferred from the node name: + +```rust +dispatcher!("remote.add"); // although the type is unknown, we can infer CMDRemoteAdd and EntryRemoteAdd +``` + +And also `#[program_setup]`: + +```rust +#[program_setup] // can infer CustomSetup from the function name `custom_setup` +fn custom_setup(program: &mut Program<ThisProgram>) { + program.with_dispatchers((CMD1, CMD2, CMD3, CMD4, CMD5)); +} +``` + +## Pathf Output Format + +Uses TOML key-value pairs, formatted as follows: + +```toml +ResultRemoteAdd = "crate::mymod::ResultRemoteAdd" +``` + +Recommended storage location is under the target directory: + +``` +/target/{target}/{crate-name}/type-mapping.toml +``` + +## Other Issues + +This solution is limited to Mingling's own syntax system. If types like `dispatcher!`, `pack!` are indirectly expanded through macros, the analyzer will not be able to discover them. + +However, this approach solves the current main pain points, so this issue can be set aside for now and addressed later. |
