fix regression introduced by attribute validation

This commit is contained in:
Michael Becker 2025-11-11 02:13:54 -05:00
parent b8401520ff
commit a83a2da677
4 changed files with 32 additions and 6 deletions

View File

@ -31,12 +31,13 @@ public abstract class AttributeImplementation<T> : AttributeImplementation
return defaultValue; return defaultValue;
} }
protected override IEnumerable<Type>? ValidDataTypes => [ typeof(T) ]; protected override IEnumerable<Type> ValidDataTypes => [ typeof(T) ];
} }
public abstract class AttributeImplementation : ClassImplementation public abstract class AttributeImplementation : ClassImplementation
{ {
protected virtual IEnumerable<Type>? ValidDataTypes { get; } protected virtual IEnumerable<Type> ValidDataTypes { get; } = [];
protected virtual IEnumerable<Type> ConvertibleDataTypes { get; } = [];
protected abstract object? ConvertFromInternal(Oms oms, object? value); protected abstract object? ConvertFromInternal(Oms oms, object? value);
public object? ReadDerivedData(BinaryReader br) public object? ReadDerivedData(BinaryReader br)
@ -66,7 +67,19 @@ public abstract class AttributeImplementation : ClassImplementation
{ {
if (value != null && !ValidDataTypes.Contains(value.GetType())) 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); ValidateInternal(oms, attributeInstance, value);

View File

@ -24,6 +24,7 @@ namespace Mocha.Core.AttributeImplementations;
public class BooleanAttributeImplementation : AttributeImplementation<bool> public class BooleanAttributeImplementation : AttributeImplementation<bool>
{ {
public override Guid ClassGuid => KnownInstanceGuids.Classes.BooleanAttribute; public override Guid ClassGuid => KnownInstanceGuids.Classes.BooleanAttribute;
protected override IEnumerable<Type> ConvertibleDataTypes => [ typeof(string) ];
protected override object? ConvertFromInternal(Oms oms, object? value) protected override object? ConvertFromInternal(Oms oms, object? value)
{ {

View File

@ -109,7 +109,7 @@ namespace Mocha.Core
if (Oms.DebugOms != null) if (Oms.DebugOms != null)
{ {
return Oms.DebugOms.GetInstanceText(this); //return Oms.DebugOms.GetInstanceText(this);
} }
return _ID.ToString(); return _ID.ToString();
} }

View File

@ -1439,11 +1439,23 @@ public abstract class Oms
// `Worker who can Resign` := `Current Signed In Worker` -> `Worker who can Resign` = `Steve` // `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 // 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
if (IsInstanceOf(assignsFromWorkData, GetInstance(KnownInstanceGuids.Classes.Attribute)))
{
context.SetWorkData(assignsToParm, context.GetWorkData(assignsFromWorkData)); 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 else
{ {
if (IsInstanceOf(assignsFromWorkData, GetInstance(KnownInstanceGuids.Classes.Class))) if (IsInstanceOf(assignsFromWorkData, GetInstance(KnownInstanceGuids.Classes.Class)))