diff options
| author | 魏曹先生 <1992414357@qq.com> | 2026-07-21 19:16:10 +0800 |
|---|---|---|
| committer | 魏曹先生 <1992414357@qq.com> | 2026-07-21 19:16:31 +0800 |
| commit | 1803dd427416ef19918c0ec7d50093b6d45f29af (patch) | |
| tree | 4caef66649536886c27e83617066b25ad6c4ac3b /mingling_core/src/any | |
| parent | 02823638a9b9c954e13b8ae7d29bd0ae98deaf51 (diff) | |
feat(any): make `Grouped` trait unsafe and encapsulate `AnyOutput`
fields
Declare `Grouped` as `unsafe trait` to make its soundness invariant
visible.
Make `AnyOutput.type_id` and `member_id` private; add public accessors
and
the `unsafe fn new_bare` constructor.
Diffstat (limited to 'mingling_core/src/any')
| -rw-r--r-- | mingling_core/src/any/group.rs | 12 |
1 files changed, 8 insertions, 4 deletions
diff --git a/mingling_core/src/any/group.rs b/mingling_core/src/any/group.rs index 2813ad5..5e5e347 100644 --- a/mingling_core/src/any/group.rs +++ b/mingling_core/src/any/group.rs @@ -2,10 +2,14 @@ use crate::{AnyOutput, ChainProcess, ProgramCollect, Routable}; /// Used to mark a type with a unique enum ID, assisting dynamic dispatch /// -/// **Note:** Unlike earlier versions, `Grouped` no longer requires `Serialize` -/// even when the `structural_renderer` feature is enabled. Structured output is -/// controlled separately via the \[`StructuralData`\] trait. -pub trait Grouped<Group> +/// # Safety +/// +/// The returned `Group` value is an enum variant created by `register_type!` when +/// registering the type's ID. Whether the variant matches correctly is guaranteed +/// by `Grouped derive` or macros like `pack!`. If implemented manually, and the +/// type name written in `member_id()` does not match the actually registered type, +/// dispatching to that type will result in **100% undefined behavior**. +pub unsafe trait Grouped<Group> where Self: Sized + 'static, { |
