Kaynağa Gözat

- Improvements to CoreExpressions, allowing them to use IVariableProvider
- Utility functions
- Minor tweaks

Kenric Nugteren 6 ay önce
ebeveyn
işleme
2371e9987c

+ 39 - 1
InABox.Core/CoreExpression.cs

@@ -93,9 +93,10 @@ namespace InABox.Core
 
         protected virtual Type? ReturnType { get; }
 
-        public CoreExpression(string expressionString)
+        public CoreExpression(string expressionString, Type? returnType = null)
         {
             Expression = new Expression(expressionString, _context);
+            ReturnType = returnType;
             if (!IsValid)
             {
                 var expr = "\"" + expressionString + "\"";
@@ -117,6 +118,32 @@ namespace InABox.Core
             return result;
         }
 
+        public object? Evaluate(IVariableProvider provider)
+        {
+            var result = Expression.Evaluate(provider);
+            if(ReturnType != null)
+            {
+                return CoreUtils.ChangeType(result, ReturnType);
+            }
+            return result;
+        }
+        public Result<T, Exception> TryEvaluate<T>(IVariableProvider provider)
+        {
+            try
+            {
+                var result = Evaluate(provider);
+                if(result is T ret)
+                {
+                    return Result.Ok(ret);
+                }
+                return Result.Ok<T>(default);
+            }
+            catch (Exception e)
+            {
+                return Result.Error(e);
+            }
+        }
+
         public static List<string> GetModelVariables(Type modelType)
         {
             var props = DatabaseSchema.Properties(modelType).Select(x => x.Name).ToList();
@@ -166,6 +193,17 @@ namespace InABox.Core
             return default;
         }
 
+        [return: MaybeNull]
+        public new TReturn Evaluate(IVariableProvider provider)
+        {
+            var result = base.Evaluate(provider);
+            if(result is TReturn ret)
+            {
+                return ret;
+            }
+            return default;
+        }
+
         public Result<TReturn, Exception> Evaluate(TModel model)
         {
             var values = new Dictionary<string, object?>();

+ 8 - 2
InABox.Core/CoreUtils.cs

@@ -2216,9 +2216,9 @@ namespace InABox.Core
             return string.Join("\n", messages);
         }
 
-        public static void LogException(string userid, Exception err, string? extra = null)
+        public static void LogException(string userid, Exception err, string? extra = null, Logger? logger = null)
         {
-            Logger.Send(LogType.Error, userid, (extra != null ? $"{extra}: " : "") + CoreUtils.FormatException(err));
+            Logger.Send(LogType.Error, userid, (extra != null ? $"{extra}: " : "") + CoreUtils.FormatException(err), transaction: logger?.Transaction);
         }
 
         #region OneToMany Relationships
@@ -2728,6 +2728,12 @@ namespace InABox.Core
             return new Queue<T>(enumerable.ToArray());
         }
 
+        public static void SortBy<T, TProp>(this T[] list, Func<T, TProp> comparison)
+            where TProp : IComparable
+        {
+            Array.Sort(list, (a, b) => comparison(a).CompareTo(comparison(b)));
+        }
+
         public static void SortBy<T, TProp>(this List<T> list, Func<T, TProp> comparison)
             where TProp : IComparable
         {

+ 6 - 0
InABox.Core/DatabaseSchema/DatabaseSchema.cs

@@ -354,6 +354,12 @@ namespace InABox.Core
         private static IEnumerable<IProperty> PropertiesInternal(Type type)
             => CheckPropertiesInternal(type)?.Values ?? Enumerable.Empty<IProperty>();
 
+        /// <summary>
+        /// Returns every property, both parents and children, for <paramref name="type"/>.
+        /// </summary>
+        public static IEnumerable<IProperty> AllProperties(Type type)
+            => PropertiesInternal(type);
+
         /// <summary>
         /// Return the standard property list for <paramref name="type"/>; this includes nested properties.
         /// </summary>

+ 1 - 1
inabox.scripting/ScriptDocument.cs

@@ -192,7 +192,7 @@ public class ScriptDocument : INotifyPropertyChanged
         return true;
     }
 
-    public void SetValue(string name, object value)
+    public void SetValue(string name, object? value)
     {
         var prop = Properties.FirstOrDefault(x => x.Name.Equals(name));
         if (prop == null)