diff --git a/mocha-dotnet/src/lib/Mocha.Core/AttributeImplementation.cs b/mocha-dotnet/src/lib/Mocha.Core/AttributeImplementation.cs index 3b1a8b9..b51427b 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); protected virtual object AutoCast(object value) @@ -72,7 +73,20 @@ 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.GetInstanceKey(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))); + throw new ArgumentException(String.Format("value {0} cannot be converted to attribute type `{1}`", value is string ? "\"" + value.ToString() + "\"" : value, 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 a922778..4c29444 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 AutoCast(object value) { diff --git a/mocha-dotnet/src/lib/Mocha.Core/Oms.cs b/mocha-dotnet/src/lib/Mocha.Core/Oms.cs index c9cdd92..86c78fb 100644 --- a/mocha-dotnet/src/lib/Mocha.Core/Oms.cs +++ b/mocha-dotnet/src/lib/Mocha.Core/Oms.cs @@ -1441,14 +1441,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 - assignsFromWorkDataValue = context.GetWorkData(assignsFromWorkData); - } - else if (IsInstanceOf(assignsToParm, GetInstance(KnownInstanceGuids.Classes.Attribute)) && IsInstanceOf(assignsFromWorkData, GetInstance(KnownInstanceGuids.Classes.ReturnAttributeMethodBinding))) - { - assignsFromWorkDataValue = Execute(context, assignsFromWorkData.GetHandle()); + 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 {