Flip concrete value nodes onto record wires with bridge rows for every value type

This commit is contained in:
Dennis Kobert
2026-08-05 22:18:50 +00:00
parent 9680d34abf
commit 7099f056dc
6 changed files with 402 additions and 8 deletions

View File

@@ -263,6 +263,27 @@ macro_rules! tagged_value {
}
}
/// The bridge rows for every wire type a value can carry, spliced
/// while plain and record worlds coexist.
pub fn record_bridge_entries() -> Vec<(core_types::ProtoNodeIdentifier, core_types::registry::RegistryEntry)> {
let mut entries = Vec::new();
entries.extend(core_types::registry::record_bridge_rows::<()>());
entries.extend(core_types::registry::record_bridge_rows::<List<f64>>());
entries.extend(core_types::registry::record_bridge_rows::<List<Color>>());
entries.extend(core_types::registry::record_bridge_rows::<List<GradientStops>>());
entries.extend(core_types::registry::record_bridge_rows::<List<BrushStroke>>());
entries.extend(core_types::registry::record_bridge_rows::<RenderOutput>());
entries.extend(core_types::registry::record_bridge_rows::<List<NodeId>>());
entries.extend(core_types::registry::record_bridge_rows::<DocumentNode>());
entries.extend(core_types::registry::record_bridge_rows::<ContextModification>());
entries.extend(core_types::registry::record_bridge_rows::<Arc<PlatformEditorApi>>());
entries.extend(core_types::registry::record_bridge_rows::<ResourceHash>());
$(
entries.extend(core_types::registry::record_bridge_rows::<$ty>());
)*
entries
}
/// Materializes the value as [`Self::to_dynany`] does, wrapped in a `ClonedNode` edge typed by [`Self::ty`].
pub fn to_edge(self) -> Result<EdgeHandle, String> {
match self {
@@ -389,8 +410,8 @@ macro_rules! tagged_value {
pub fn from_type(input: &Type) -> Option<Self> {
match input {
Type::Generic(_) => None,
Type::Ref(_) => None,
Type::Record(_) => None,
Type::Ref(inner) => Self::from_type(inner),
Type::Record(inner) => Self::from_type(inner),
Type::Concrete(concrete_type) => {
let name = concrete_type.name.as_ref();
// TODO: Add default implementations for types such as TaggedValue::Subpaths, and use the defaults here and in document_node_types

View File

@@ -934,6 +934,8 @@ fn ref_adapter(proposed: &Type, wanted: &Type) -> Option<ProtoNodeIdentifier> {
(proposed_output @ Type::Concrete(_), Type::Ref(inner)) if valid_type(proposed_output, inner) => Some(ProtoNodeIdentifier::new("graphene_core::memo::LendNode")),
(Type::Record(inner), wanted_output @ Type::Concrete(_)) if valid_type(inner, wanted_output) => Some(ProtoNodeIdentifier::new("core_types::record::RecordExtractNode")),
(proposed_output @ Type::Concrete(_), Type::Record(inner)) if valid_type(proposed_output, inner) => Some(ProtoNodeIdentifier::new("core_types::record::RecordLiftNode")),
(Type::Ref(inner), Type::Record(wanted_inner)) if valid_type(inner, wanted_inner) => Some(ProtoNodeIdentifier::new("core_types::record::RecordLiftLendNode")),
(Type::Record(inner), Type::Ref(wanted_inner)) if valid_type(inner, wanted_inner) => Some(ProtoNodeIdentifier::new("core_types::record::RecordExtractLendNode")),
_ => None,
}
}