From a83a2da677651ddcb56fd85f1290a24b39646924 Mon Sep 17 00:00:00 2001 From: Michael Becker Date: Tue, 11 Nov 2025 02:13:54 -0500 Subject: [PATCH] fix regression introduced by attribute validation --- .../lib/Mocha.Core/AttributeImplementation.cs | 19 ++++++++++++++++--- .../BooleanAttributeImplementation.cs | 1 + .../src/lib/Mocha.Core/InstanceHandle.cs | 2 +- mocha-dotnet/src/lib/Mocha.Core/Oms.cs | 16 ++++++++++++++-- 4 files changed, 32 insertions(+), 6 deletions(-) diff --git a/mocha-dotnet/src/lib/Mocha.Core/AttributeImplementation.cs b/mocha-dotnet/src/lib/Mocha.Core/AttributeImplementation.cs index 00bd958..d3f012a 100644 --- a/mocha-dotnet/src/lib/Mocha.Core/AttributeImplementation.cs +++ b/mocha-dotnet/src/lib/Mocha.Core/AttributeImplementation.cs @@ -31,12 +31,13 @@ public abstract class AttributeImplementation : AttributeImplementation return defaultValue; } - protected override IEnumerable? ValidDataTypes => [ typeof(T) ]; + protected override IEnumerable ValidDataTypes => [ typeof(T) ]; } public abstract class AttributeImplementation : ClassImplementation { - protected virtual IEnumerable? ValidDataTypes { get; } + protected virtual IEnumerable ValidDataTypes { get; } = []; + protected virtual IEnumerable ConvertibleDataTypes { get; } = []; protected abstract object? ConvertFromInternal(Oms oms, object? value); public object? ReadDerivedData(BinaryReader br) @@ -66,7 +67,19 @@ public abstract class AttributeImplementation : ClassImplementation { if (value != null && !ValidDataTypes.Contains(value.GetType())) { - throw new ArgumentException(String.Format("value {0} cannot be converted to attribute type `{1}`", value is string ? "\"" + value.ToString() + "\"" : value, oms.GetInstanceText(attributeInstance))); + if (ConvertibleDataTypes.Contains(value.GetType())) + { + // object? p = ConvertFromInternal(oms, value); + } + else + { + string id = value.ToString(); + if (value is InstanceHandle ih) + { + id = oms.GetGlobalIdentifier(ih).ToString("b"); + } + throw new ArgumentException(String.Format("value {0} cannot be converted to attribute type `{1}` [{2}]", value is string ? "\"" + value.ToString() + "\"" : id, oms.GetInstanceText(attributeInstance), oms.GetInstanceKey(attributeInstance))); + } } } ValidateInternal(oms, attributeInstance, value); diff --git a/mocha-dotnet/src/lib/Mocha.Core/AttributeImplementations/BooleanAttributeImplementation.cs b/mocha-dotnet/src/lib/Mocha.Core/AttributeImplementations/BooleanAttributeImplementation.cs index 8e6c83d..69d0adf 100644 --- a/mocha-dotnet/src/lib/Mocha.Core/AttributeImplementations/BooleanAttributeImplementation.cs +++ b/mocha-dotnet/src/lib/Mocha.Core/AttributeImplementations/BooleanAttributeImplementation.cs @@ -24,6 +24,7 @@ namespace Mocha.Core.AttributeImplementations; public class BooleanAttributeImplementation : AttributeImplementation { public override Guid ClassGuid => KnownInstanceGuids.Classes.BooleanAttribute; + protected override IEnumerable ConvertibleDataTypes => [ typeof(string) ]; protected override object? ConvertFromInternal(Oms oms, object? value) { diff --git a/mocha-dotnet/src/lib/Mocha.Core/InstanceHandle.cs b/mocha-dotnet/src/lib/Mocha.Core/InstanceHandle.cs index 3c743c8..0cc8cce 100755 --- a/mocha-dotnet/src/lib/Mocha.Core/InstanceHandle.cs +++ b/mocha-dotnet/src/lib/Mocha.Core/InstanceHandle.cs @@ -109,7 +109,7 @@ namespace Mocha.Core if (Oms.DebugOms != null) { - return Oms.DebugOms.GetInstanceText(this); + //return Oms.DebugOms.GetInstanceText(this); } return _ID.ToString(); } diff --git a/mocha-dotnet/src/lib/Mocha.Core/Oms.cs b/mocha-dotnet/src/lib/Mocha.Core/Oms.cs index 57cd478..7bbc895 100644 --- a/mocha-dotnet/src/lib/Mocha.Core/Oms.cs +++ b/mocha-dotnet/src/lib/Mocha.Core/Oms.cs @@ -1439,10 +1439,22 @@ public abstract class Oms // `Worker who can Resign` := `Current Signed In Worker` -> `Worker who can Resign` = `Steve` - if (IsInstanceOf(assignsToParm, GetInstance(KnownInstanceGuids.Classes.Attribute)) && IsInstanceOf(assignsFromWorkData, GetInstance(KnownInstanceGuids.Classes.Attribute))) + if (IsInstanceOf(assignsToParm, GetInstance(KnownInstanceGuids.Classes.Attribute))) { // if `assigns to Parm` is a Class which inherits from Attribute, and `assigns from Work Data` is an Attribute, then assign the underlying work data - context.SetWorkData(assignsToParm, context.GetWorkData(assignsFromWorkData)); + if (IsInstanceOf(assignsFromWorkData, GetInstance(KnownInstanceGuids.Classes.Attribute))) + { + context.SetWorkData(assignsToParm, context.GetWorkData(assignsFromWorkData)); + } + else if (IsInstanceOf(assignsFromWorkData, GetInstance(KnownInstanceGuids.Classes.ExecutableReturningAttribute))) + { + InstanceHandle ih = Execute(context, assignsFromWorkData.GetHandle(), null); + context.SetWorkData(assignsToParm, context.GetWorkData(ih)); + } + else + { + throw new InvalidOperationException("cannot assign that to an Attribute!"); + } } else {