diff --git a/ExpressionEngine/ExpressionEngineDIExtensions.cs b/ExpressionEngine/ExpressionEngineDIExtensions.cs new file mode 100644 index 0000000..39b9076 --- /dev/null +++ b/ExpressionEngine/ExpressionEngineDIExtensions.cs @@ -0,0 +1,55 @@ +using System; +using System.Linq; +using System.Reflection; +using ExpressionEngine.Functions.Base; +using Microsoft.Extensions.DependencyInjection; + +namespace ExpressionEngine +{ + /// + /// Extension methods for service collection + /// + public static class ExpressionEngineDiExtensions + { + /// + /// Find function implementations registered with . + /// + /// The function only scans the given type's assembly + /// + /// + /// Assembly to scan + /// + /// + public static IServiceCollection WithFunctionDiscovery(this IServiceCollection serviceCollection) + { + var addFunctionMethodInfo = typeof(ExpressionEngineDiExtensions).GetMethod(nameof(AddFunction)); + + if (addFunctionMethodInfo == null) + throw new Exception(); + + var functions = + typeof(T) + .Assembly + .GetTypes() + .Where(t => t.GetCustomAttributes().Any()); + + foreach (var function in functions) + { + var generic = addFunctionMethodInfo.MakeGenericMethod(function); + generic.Invoke(null, new object[] {serviceCollection}); + } + + return serviceCollection; + } + + /// + /// + /// + /// + /// + private static void AddFunction(IServiceCollection serviceCollection) where T : class, IFunction + { + serviceCollection.AddFunction(); + } + } +} \ No newline at end of file diff --git a/ExpressionEngine/FlowRunnerDependencyExtension.cs b/ExpressionEngine/FlowRunnerDependencyExtension.cs index 66050da..d74a77e 100644 --- a/ExpressionEngine/FlowRunnerDependencyExtension.cs +++ b/ExpressionEngine/FlowRunnerDependencyExtension.cs @@ -1,11 +1,6 @@ using System; using ExpressionEngine.Functions.Base; using ExpressionEngine.Functions.CustomException; -using ExpressionEngine.Functions.Implementations.CollectionFunctions; -using ExpressionEngine.Functions.Implementations.ConversionFunctions; -using ExpressionEngine.Functions.Implementations.LogicalComparisonFunctions; -using ExpressionEngine.Functions.Implementations.StringFunctions; -using ExpressionEngine.Functions.Math; using Microsoft.Extensions.DependencyInjection; namespace ExpressionEngine @@ -15,6 +10,7 @@ namespace ExpressionEngine /// public static class FlowRunnerDependencyExtension { + /// /// Add necessary dependencies inorder to use expression engine. /// @@ -24,35 +20,30 @@ public static void AddExpressionEngine(this IServiceCollection services) services.AddScoped(); services.AddScoped(); - AddStringFunctions(services); - AddCollectionFunction(services); - AddConversionFunction(services); - AddLogicalComparisonFunctions(services); - AddMathFunctions(services); - - services.RegisterTransientFunctionAlias("length"); - services.RegisterTransientFunctionAlias("greater"); + services.WithFunctionDiscovery(); } - + /// /// Register function to be used in expression, function implementation must implement . /// /// Services which to add function metadata /// name of function used to invoke it /// Function implementation + [Obsolete("Use '.AddFunction().AsTransient().WithAlias()' instead")] public static void RegisterTransientFunctionAlias(this IServiceCollection services, string functionName) where T : class, IFunction { services.AddTransient(); services.AddSingleton(new FunctionMetadata(typeof(T), functionName)); } - + /// /// Register function to be used in expression, function implementation must implement . /// /// Services which to add function metadata /// name of function used to invoke it /// Function implementation + [Obsolete("Use '.AddFunction().AsScoped().WithAlias()' instead")] public static void RegisterScopedFunctionAlias(this IServiceCollection services, string functionName) where T : class, IFunction { @@ -67,6 +58,7 @@ public static void RegisterScopedFunctionAlias(this IServiceCollection servic /// name of function used to invoke it /// /// Function implementation + [Obsolete("Use '.AddFunction().AsScoped().WithAlias()' instead")] public static void RegisterScopedFunctionAlias(this IServiceCollection services, string functionName, Func implementationFactory) where T : class, IFunction @@ -81,87 +73,16 @@ public static void RegisterScopedFunctionAlias(this IServiceCollection servic /// /// The name of the function, without function parenthesis /// The full expression which is inserted - public static void AddFunctionDefinition(this IServiceCollection services, string fromFunctionName, string toExpression) + public static void AddFunctionDefinition(this IServiceCollection services, string fromFunctionName, + string toExpression) { if (fromFunctionName.EndsWith("()")) { throw new ArgumentError($"{nameof(fromFunctionName)} cannot end in ()"); } - services.AddSingleton(new FunctionDefinition{From = fromFunctionName + "()", To = toExpression}); - } - - private static void AddStringFunctions(IServiceCollection services) - { - services.RegisterTransientFunctionAlias("concat"); - services.RegisterTransientFunctionAlias("endsWith"); - services.RegisterTransientFunctionAlias("formatNumber"); - services.RegisterTransientFunctionAlias("guid"); - services.RegisterTransientFunctionAlias("indexOf"); - services.RegisterTransientFunctionAlias("lastIndexOf"); - services.RegisterTransientFunctionAlias("length"); - services.RegisterTransientFunctionAlias("replace"); - services.RegisterTransientFunctionAlias("split"); - services.RegisterTransientFunctionAlias("startsWith"); - services.RegisterTransientFunctionAlias("substring"); - services.RegisterTransientFunctionAlias("toLower"); - services.RegisterTransientFunctionAlias("toUpper"); - services.RegisterTransientFunctionAlias("trim"); - } - - private static void AddCollectionFunction(IServiceCollection services) - { - services.RegisterTransientFunctionAlias("contains"); - services.RegisterTransientFunctionAlias("empty"); - services.RegisterTransientFunctionAlias("first"); - services.RegisterTransientFunctionAlias("intersection"); - services.RegisterTransientFunctionAlias("join"); - services.RegisterTransientFunctionAlias("last"); - services.RegisterTransientFunctionAlias("length"); - services.RegisterTransientFunctionAlias("skip"); - services.RegisterTransientFunctionAlias("take"); - services.RegisterTransientFunctionAlias("union"); - } - - private static void AddConversionFunction(IServiceCollection services) - { - services.RegisterTransientFunctionAlias("array"); - services.RegisterTransientFunctionAlias("base64"); - services.RegisterTransientFunctionAlias("base64ToBinary"); - services.RegisterTransientFunctionAlias("base64ToString"); - services.RegisterTransientFunctionAlias("binary"); - services.RegisterTransientFunctionAlias("bool"); - services.RegisterTransientFunctionAlias("createArray"); - services.RegisterTransientFunctionAlias("dataUri"); - services.RegisterTransientFunctionAlias("dataUriToBinary"); - services.RegisterTransientFunctionAlias("float"); - services.RegisterTransientFunctionAlias("int"); - } - - private static void AddLogicalComparisonFunctions(IServiceCollection services) - { - services.RegisterTransientFunctionAlias("and"); - services.RegisterTransientFunctionAlias("equal"); - services.RegisterTransientFunctionAlias("greater"); - services.RegisterTransientFunctionAlias("greaterOrEquals"); - services.RegisterTransientFunctionAlias("if"); - services.RegisterTransientFunctionAlias("less"); - services.RegisterTransientFunctionAlias("lessOrEquals"); - services.RegisterTransientFunctionAlias("not"); - services.RegisterTransientFunctionAlias("or"); - } - - private static void AddMathFunctions(IServiceCollection services) - { - services.RegisterTransientFunctionAlias("add"); - services.RegisterTransientFunctionAlias("div"); - services.RegisterTransientFunctionAlias("max"); - services.RegisterTransientFunctionAlias("min"); - services.RegisterTransientFunctionAlias("mod"); - services.RegisterTransientFunctionAlias("mul"); - services.RegisterTransientFunctionAlias("rand"); - services.RegisterTransientFunctionAlias("range"); - services.RegisterTransientFunctionAlias("sub"); + services.AddSingleton(new FunctionDefinition + {From = fromFunctionName + "()", To = toExpression}); } } } \ No newline at end of file diff --git a/ExpressionEngine/FunctionBuilder.cs b/ExpressionEngine/FunctionBuilder.cs new file mode 100644 index 0000000..e019ee9 --- /dev/null +++ b/ExpressionEngine/FunctionBuilder.cs @@ -0,0 +1,141 @@ +using System; +using System.Reflection; +using ExpressionEngine.Functions.Base; +using Microsoft.Extensions.DependencyInjection; + +namespace ExpressionEngine +{ + /// + /// + /// + public static class FunctionBuilderExt + { + /// + /// Initiate Function builder for registering a Function, preloaded with + /// + /// ServiceCollection to which the function is registered + /// Type of the Function + /// + public static FunctionBuilder BuildFunction(this IServiceCollection serviceCollection) + where TFunction : class, IFunction + { + var t = new FunctionBuilder(serviceCollection); + + var functionRegistrationAttributes = typeof(TFunction).GetCustomAttributes(); + + foreach (var functionRegistrationAttribute in functionRegistrationAttributes) + { + t.SetScope(functionRegistrationAttribute.Scope); + t.WithAlias(functionRegistrationAttribute.FunctionName); + } + + return t; + } + + /// + /// Add function using + /// + /// ServiceCollection to which the function is registered + /// Type of the Function + /// + public static IServiceCollection AddFunction(this IServiceCollection serviceCollection) + where TFunction : class, IFunction + { + return serviceCollection.BuildFunction().Add(); + } + } + + /// + /// FunctionBuilder is responsible for adding a Function properly + /// + /// Type of the Function + public class FunctionBuilder where T : class, IFunction + { + private readonly IServiceCollection _serviceCollection; + private Scope _scope = Scope.Transient; + + /// + /// Set scope without using As{Scope} + /// + /// + internal void SetScope(Scope scope) + { + _scope = scope; + } + + /// + /// Create function builder + /// + /// ServiceCollection to which the function is registered + public FunctionBuilder(IServiceCollection serviceCollection) + { + _serviceCollection = serviceCollection; + } + + /// + /// Add Function as transient + /// + /// builder + public FunctionBuilder AsTransient() + { + _scope = Scope.Transient; + return this; + } + + /// + /// Add Function as scoped + /// + /// builder + public FunctionBuilder AsScoped() + { + _scope = Scope.Scoped; + return this; + } + + /// + /// Add Function as singleton + /// + /// builder + public FunctionBuilder AsSingleton() + { + _scope = Scope.Singleton; + return this; + } + + /// + /// Associate alias with Function, an alias can be used to invoke a function. + /// + /// function alias + /// builder + public FunctionBuilder WithAlias(string alias) + { + _serviceCollection.AddSingleton(new FunctionMetadata(typeof(T), alias)); + return this; + } + + /// + /// Add build Function to ServiceCollection + /// + /// + /// + public IServiceCollection Add() + { + switch (_scope) + { + case Scope.Scoped: + _serviceCollection.AddScoped(); + break; + case Scope.Transient: + _serviceCollection.AddTransient(); + break; + case Scope.Singleton: + _serviceCollection.AddSingleton(); + break; + default: + throw new ArgumentOutOfRangeException(); + } + + return _serviceCollection; + } + } +} \ No newline at end of file diff --git a/ExpressionEngine/FunctionRegistrationAttribute.cs b/ExpressionEngine/FunctionRegistrationAttribute.cs new file mode 100644 index 0000000..c9175d5 --- /dev/null +++ b/ExpressionEngine/FunctionRegistrationAttribute.cs @@ -0,0 +1,29 @@ +using System; + +namespace ExpressionEngine +{ + /// + /// + /// + [AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = false)] + public class FunctionRegistrationAttribute : Attribute + { + /// + /// Function Name + /// + public string FunctionName { get; } + public Scope Scope { get; } + + /// + /// Enable function to be discovered by .WithFunctionDiscovery$lt{T}$gt . + /// Or to be added easily with .AddFunction; + /// + /// Name of function + /// DI Scope - defaults to Transient + public FunctionRegistrationAttribute(string functionName, Scope scope = Scope.Transient) + { + FunctionName = functionName; + Scope = scope; + } + } +} \ No newline at end of file diff --git a/ExpressionEngine/Functions/Functions.cs b/ExpressionEngine/Functions/Functions.cs new file mode 100644 index 0000000..3bdbc29 --- /dev/null +++ b/ExpressionEngine/Functions/Functions.cs @@ -0,0 +1,10 @@ +namespace ExpressionEngine.Functions +{ + /// + /// Is used to discover functions within this namespace + /// + public abstract class Functions + { + + } +} \ No newline at end of file diff --git a/ExpressionEngine/Functions/Implementations/CollectionFunctions/ContainsFunction.cs b/ExpressionEngine/Functions/Implementations/CollectionFunctions/ContainsFunction.cs index c7254aa..c36d065 100644 --- a/ExpressionEngine/Functions/Implementations/CollectionFunctions/ContainsFunction.cs +++ b/ExpressionEngine/Functions/Implementations/CollectionFunctions/ContainsFunction.cs @@ -6,6 +6,7 @@ namespace ExpressionEngine.Functions.Implementations.CollectionFunctions { + [FunctionRegistration("contains")] public class ContainsFunction : IFunction { public ValueTask ExecuteFunction(params ValueContainer[] parameters) @@ -44,4 +45,4 @@ public ValueTask ExecuteFunction(params ValueContainer[] paramet } } } -} +} \ No newline at end of file diff --git a/ExpressionEngine/Functions/Implementations/CollectionFunctions/EmptyFunction.cs b/ExpressionEngine/Functions/Implementations/CollectionFunctions/EmptyFunction.cs index c1d76a3..862a497 100644 --- a/ExpressionEngine/Functions/Implementations/CollectionFunctions/EmptyFunction.cs +++ b/ExpressionEngine/Functions/Implementations/CollectionFunctions/EmptyFunction.cs @@ -5,6 +5,7 @@ namespace ExpressionEngine.Functions.Implementations.CollectionFunctions { + [FunctionRegistration("empty")] public class EmptyFunction : IFunction { public ValueTask ExecuteFunction(params ValueContainer[] parameters) diff --git a/ExpressionEngine/Functions/Implementations/CollectionFunctions/FirstFunction.cs b/ExpressionEngine/Functions/Implementations/CollectionFunctions/FirstFunction.cs index 7702bda..b49aa17 100644 --- a/ExpressionEngine/Functions/Implementations/CollectionFunctions/FirstFunction.cs +++ b/ExpressionEngine/Functions/Implementations/CollectionFunctions/FirstFunction.cs @@ -5,6 +5,7 @@ namespace ExpressionEngine.Functions.Implementations.CollectionFunctions { + [FunctionRegistration("first")] public class FirstFunction : IFunction { public ValueTask ExecuteFunction(params ValueContainer[] parameters) diff --git a/ExpressionEngine/Functions/Implementations/CollectionFunctions/IntersectionFunction.cs b/ExpressionEngine/Functions/Implementations/CollectionFunctions/IntersectionFunction.cs index 46e3e63..bfb6f0f 100644 --- a/ExpressionEngine/Functions/Implementations/CollectionFunctions/IntersectionFunction.cs +++ b/ExpressionEngine/Functions/Implementations/CollectionFunctions/IntersectionFunction.cs @@ -5,6 +5,7 @@ namespace ExpressionEngine.Functions.Implementations.CollectionFunctions { + [FunctionRegistration("intersection")] public class InterSectionFunction : IFunction { public ValueTask ExecuteFunction(params ValueContainer[] parameters) diff --git a/ExpressionEngine/Functions/Implementations/CollectionFunctions/JoinFunction.cs b/ExpressionEngine/Functions/Implementations/CollectionFunctions/JoinFunction.cs index 5c60c70..5c6c3ed 100644 --- a/ExpressionEngine/Functions/Implementations/CollectionFunctions/JoinFunction.cs +++ b/ExpressionEngine/Functions/Implementations/CollectionFunctions/JoinFunction.cs @@ -5,6 +5,7 @@ namespace ExpressionEngine.Functions.Implementations.CollectionFunctions { + [FunctionRegistration("join")] public class JoinFunction : IFunction { public ValueTask ExecuteFunction(params ValueContainer[] parameters) diff --git a/ExpressionEngine/Functions/Implementations/CollectionFunctions/LastFunction.cs b/ExpressionEngine/Functions/Implementations/CollectionFunctions/LastFunction.cs index 9b060b9..62268ae 100644 --- a/ExpressionEngine/Functions/Implementations/CollectionFunctions/LastFunction.cs +++ b/ExpressionEngine/Functions/Implementations/CollectionFunctions/LastFunction.cs @@ -5,6 +5,7 @@ namespace ExpressionEngine.Functions.Implementations.CollectionFunctions { + [FunctionRegistration("last")] public class LastFunction : IFunction { public ValueTask ExecuteFunction(params ValueContainer[] parameters) diff --git a/ExpressionEngine/Functions/Implementations/CollectionFunctions/SkipFunction.cs b/ExpressionEngine/Functions/Implementations/CollectionFunctions/SkipFunction.cs index 1e42087..12ceff9 100644 --- a/ExpressionEngine/Functions/Implementations/CollectionFunctions/SkipFunction.cs +++ b/ExpressionEngine/Functions/Implementations/CollectionFunctions/SkipFunction.cs @@ -5,6 +5,7 @@ namespace ExpressionEngine.Functions.Implementations.CollectionFunctions { + [FunctionRegistration("skip")] public class SkipFunction : IFunction { public ValueTask ExecuteFunction(params ValueContainer[] parameters) diff --git a/ExpressionEngine/Functions/Implementations/CollectionFunctions/TakeFunction.cs b/ExpressionEngine/Functions/Implementations/CollectionFunctions/TakeFunction.cs index 8f3b628..d6ef4f1 100644 --- a/ExpressionEngine/Functions/Implementations/CollectionFunctions/TakeFunction.cs +++ b/ExpressionEngine/Functions/Implementations/CollectionFunctions/TakeFunction.cs @@ -5,6 +5,7 @@ namespace ExpressionEngine.Functions.Implementations.CollectionFunctions { + [FunctionRegistration("take")] public class TakeFunction : IFunction { public ValueTask ExecuteFunction(params ValueContainer[] parameters) diff --git a/ExpressionEngine/Functions/Implementations/CollectionFunctions/UnionFunction.cs b/ExpressionEngine/Functions/Implementations/CollectionFunctions/UnionFunction.cs index 9a7e88d..7126c31 100644 --- a/ExpressionEngine/Functions/Implementations/CollectionFunctions/UnionFunction.cs +++ b/ExpressionEngine/Functions/Implementations/CollectionFunctions/UnionFunction.cs @@ -5,6 +5,7 @@ namespace ExpressionEngine.Functions.Implementations.CollectionFunctions { + [FunctionRegistration("union")] public class UnionFunction : IFunction { public async ValueTask ExecuteFunction(params ValueContainer[] parameters) diff --git a/ExpressionEngine/Functions/Implementations/ConversionFunctions/ArrayFunction.cs b/ExpressionEngine/Functions/Implementations/ConversionFunctions/ArrayFunction.cs index 50c7df7..52f0ab2 100644 --- a/ExpressionEngine/Functions/Implementations/ConversionFunctions/ArrayFunction.cs +++ b/ExpressionEngine/Functions/Implementations/ConversionFunctions/ArrayFunction.cs @@ -3,6 +3,7 @@ namespace ExpressionEngine.Functions.Implementations.ConversionFunctions { + [FunctionRegistration("array")] public class ArrayFunction : IFunction { public ValueTask ExecuteFunction(params ValueContainer[] parameters) diff --git a/ExpressionEngine/Functions/Implementations/ConversionFunctions/Base64Function.cs b/ExpressionEngine/Functions/Implementations/ConversionFunctions/Base64Function.cs index 0247989..dac8e4a 100644 --- a/ExpressionEngine/Functions/Implementations/ConversionFunctions/Base64Function.cs +++ b/ExpressionEngine/Functions/Implementations/ConversionFunctions/Base64Function.cs @@ -3,6 +3,7 @@ namespace ExpressionEngine.Functions.Implementations.ConversionFunctions { + [FunctionRegistration("base64")] public class Base64Function : IFunction { public ValueTask ExecuteFunction(params ValueContainer[] parameters) diff --git a/ExpressionEngine/Functions/Implementations/ConversionFunctions/Base64ToBinaryFunction.cs b/ExpressionEngine/Functions/Implementations/ConversionFunctions/Base64ToBinaryFunction.cs index 1e1190d..9e23eeb 100644 --- a/ExpressionEngine/Functions/Implementations/ConversionFunctions/Base64ToBinaryFunction.cs +++ b/ExpressionEngine/Functions/Implementations/ConversionFunctions/Base64ToBinaryFunction.cs @@ -5,6 +5,7 @@ namespace ExpressionEngine.Functions.Implementations.ConversionFunctions { + [FunctionRegistration("base64ToBinary")] public class Base64ToBinaryFunction : IFunction { public ValueTask ExecuteFunction(params ValueContainer[] parameters) diff --git a/ExpressionEngine/Functions/Implementations/ConversionFunctions/Base64ToStringFunction.cs b/ExpressionEngine/Functions/Implementations/ConversionFunctions/Base64ToStringFunction.cs index c15ca9a..43050e8 100644 --- a/ExpressionEngine/Functions/Implementations/ConversionFunctions/Base64ToStringFunction.cs +++ b/ExpressionEngine/Functions/Implementations/ConversionFunctions/Base64ToStringFunction.cs @@ -5,6 +5,7 @@ namespace ExpressionEngine.Functions.Implementations.ConversionFunctions { + [FunctionRegistration("base64ToString")] public class Base64ToStringFunction : IFunction { public ValueTask ExecuteFunction(params ValueContainer[] parameters) @@ -12,10 +13,11 @@ public ValueTask ExecuteFunction(params ValueContainer[] paramet return parameters[0].Type() switch { ValueType.String => - new ValueTask(new ValueContainer(Encoding.UTF8.GetString(Convert.FromBase64String(parameters[0].GetValue())))), + new ValueTask(new ValueContainer( + Encoding.UTF8.GetString(Convert.FromBase64String(parameters[0].GetValue())))), _ => throw new ExpressionEngineException( $"Array function can only operate on strings, not {parameters[0].Type()}.") }; } } -} +} \ No newline at end of file diff --git a/ExpressionEngine/Functions/Implementations/ConversionFunctions/BinaryFunction.cs b/ExpressionEngine/Functions/Implementations/ConversionFunctions/BinaryFunction.cs index 3599899..8ec32c2 100644 --- a/ExpressionEngine/Functions/Implementations/ConversionFunctions/BinaryFunction.cs +++ b/ExpressionEngine/Functions/Implementations/ConversionFunctions/BinaryFunction.cs @@ -6,6 +6,7 @@ namespace ExpressionEngine.Functions.Implementations.ConversionFunctions { + [FunctionRegistration("binary")] public class BinaryFunction : IFunction { public ValueTask ExecuteFunction(params ValueContainer[] parameters) diff --git a/ExpressionEngine/Functions/Implementations/ConversionFunctions/BoolFunction.cs b/ExpressionEngine/Functions/Implementations/ConversionFunctions/BoolFunction.cs index 875b7f8..43c5f00 100644 --- a/ExpressionEngine/Functions/Implementations/ConversionFunctions/BoolFunction.cs +++ b/ExpressionEngine/Functions/Implementations/ConversionFunctions/BoolFunction.cs @@ -3,6 +3,7 @@ namespace ExpressionEngine.Functions.Implementations.ConversionFunctions { + [FunctionRegistration("bool")] public class BoolFunction : IFunction { public ValueTask ExecuteFunction(params ValueContainer[] parameters) diff --git a/ExpressionEngine/Functions/Implementations/ConversionFunctions/CreateArrayFunction.cs b/ExpressionEngine/Functions/Implementations/ConversionFunctions/CreateArrayFunction.cs index afae1b6..08bdeed 100644 --- a/ExpressionEngine/Functions/Implementations/ConversionFunctions/CreateArrayFunction.cs +++ b/ExpressionEngine/Functions/Implementations/ConversionFunctions/CreateArrayFunction.cs @@ -5,6 +5,7 @@ namespace ExpressionEngine.Functions.Implementations.ConversionFunctions { + [FunctionRegistration("createArray")] public class CreateArrayFunction : IFunction { public ValueTask ExecuteFunction(params ValueContainer[] parameters) diff --git a/ExpressionEngine/Functions/Implementations/ConversionFunctions/DataUriFunction.cs b/ExpressionEngine/Functions/Implementations/ConversionFunctions/DataUriFunction.cs index 6634dbe..bf0cc60 100644 --- a/ExpressionEngine/Functions/Implementations/ConversionFunctions/DataUriFunction.cs +++ b/ExpressionEngine/Functions/Implementations/ConversionFunctions/DataUriFunction.cs @@ -4,6 +4,7 @@ namespace ExpressionEngine.Functions.Implementations.ConversionFunctions { + [FunctionRegistration("dataUri")] public class DataUriFunction : IFunction { public ValueTask ExecuteFunction(params ValueContainer[] parameters) diff --git a/ExpressionEngine/Functions/Implementations/ConversionFunctions/DataUriToBinaryFunction.cs b/ExpressionEngine/Functions/Implementations/ConversionFunctions/DataUriToBinaryFunction.cs index 4cff995..95f119c 100644 --- a/ExpressionEngine/Functions/Implementations/ConversionFunctions/DataUriToBinaryFunction.cs +++ b/ExpressionEngine/Functions/Implementations/ConversionFunctions/DataUriToBinaryFunction.cs @@ -7,6 +7,7 @@ namespace ExpressionEngine.Functions.Implementations.ConversionFunctions { + [FunctionRegistration("dataUriToBinary")] public class DataUriToBinaryFunction : IFunction { public ValueTask ExecuteFunction(params ValueContainer[] parameters) diff --git a/ExpressionEngine/Functions/Implementations/ConversionFunctions/FloatFunction.cs b/ExpressionEngine/Functions/Implementations/ConversionFunctions/FloatFunction.cs index 45c7264..a9b32d1 100644 --- a/ExpressionEngine/Functions/Implementations/ConversionFunctions/FloatFunction.cs +++ b/ExpressionEngine/Functions/Implementations/ConversionFunctions/FloatFunction.cs @@ -1,10 +1,10 @@ -using System; -using System.Threading.Tasks; +using System.Threading.Tasks; using ExpressionEngine.Functions.Base; using ExpressionEngine.Functions.CustomException; namespace ExpressionEngine.Functions.Implementations.ConversionFunctions { + [FunctionRegistration("float")] public class FloatFunction : IFunction { public ValueTask ExecuteFunction(params ValueContainer[] parameters) diff --git a/ExpressionEngine/Functions/Implementations/ConversionFunctions/IntFunction.cs b/ExpressionEngine/Functions/Implementations/ConversionFunctions/IntFunction.cs index 667b115..4fc5974 100644 --- a/ExpressionEngine/Functions/Implementations/ConversionFunctions/IntFunction.cs +++ b/ExpressionEngine/Functions/Implementations/ConversionFunctions/IntFunction.cs @@ -5,6 +5,7 @@ namespace ExpressionEngine.Functions.Implementations.ConversionFunctions { + [FunctionRegistration("int")] public class IntFunction : IFunction { public ValueTask ExecuteFunction(params ValueContainer[] parameters) diff --git a/ExpressionEngine/Functions/Implementations/LogicalComparisonFunctions/AndFunction.cs b/ExpressionEngine/Functions/Implementations/LogicalComparisonFunctions/AndFunction.cs index 8747070..b8834bb 100644 --- a/ExpressionEngine/Functions/Implementations/LogicalComparisonFunctions/AndFunction.cs +++ b/ExpressionEngine/Functions/Implementations/LogicalComparisonFunctions/AndFunction.cs @@ -4,6 +4,7 @@ namespace ExpressionEngine.Functions.Implementations.LogicalComparisonFunctions { + [FunctionRegistration("and")] public class AndFunction : IFunction { public ValueTask ExecuteFunction(params ValueContainer[] parameters) diff --git a/ExpressionEngine/Functions/Implementations/LogicalComparisonFunctions/EqualFunction.cs b/ExpressionEngine/Functions/Implementations/LogicalComparisonFunctions/EqualFunction.cs index bc5a98d..370b218 100644 --- a/ExpressionEngine/Functions/Implementations/LogicalComparisonFunctions/EqualFunction.cs +++ b/ExpressionEngine/Functions/Implementations/LogicalComparisonFunctions/EqualFunction.cs @@ -4,6 +4,7 @@ namespace ExpressionEngine.Functions.Implementations.LogicalComparisonFunctions { + [FunctionRegistration("equal")] public class EqualFunction : IFunction { public ValueTask ExecuteFunction(params ValueContainer[] parameters) diff --git a/ExpressionEngine/Functions/Implementations/LogicalComparisonFunctions/GreaterFunction.cs b/ExpressionEngine/Functions/Implementations/LogicalComparisonFunctions/GreaterFunction.cs index 30cf863..833b3c6 100644 --- a/ExpressionEngine/Functions/Implementations/LogicalComparisonFunctions/GreaterFunction.cs +++ b/ExpressionEngine/Functions/Implementations/LogicalComparisonFunctions/GreaterFunction.cs @@ -4,6 +4,7 @@ namespace ExpressionEngine.Functions.Implementations.LogicalComparisonFunctions { + [FunctionRegistration("greater")] public class GreaterFunction : IFunction { public ValueTask ExecuteFunction(params ValueContainer[] parameters) diff --git a/ExpressionEngine/Functions/Implementations/LogicalComparisonFunctions/GreaterOrEqualsFunction.cs b/ExpressionEngine/Functions/Implementations/LogicalComparisonFunctions/GreaterOrEqualsFunction.cs index 26aa6f5..e59ca22 100644 --- a/ExpressionEngine/Functions/Implementations/LogicalComparisonFunctions/GreaterOrEqualsFunction.cs +++ b/ExpressionEngine/Functions/Implementations/LogicalComparisonFunctions/GreaterOrEqualsFunction.cs @@ -4,6 +4,7 @@ namespace ExpressionEngine.Functions.Implementations.LogicalComparisonFunctions { + [FunctionRegistration("geraterOrEquals")] public class GreaterOrEqualsFunction : IFunction { public ValueTask ExecuteFunction(params ValueContainer[] parameters) diff --git a/ExpressionEngine/Functions/Implementations/LogicalComparisonFunctions/IfFunction.cs b/ExpressionEngine/Functions/Implementations/LogicalComparisonFunctions/IfFunction.cs index 4fa0f87..ca8c5e5 100644 --- a/ExpressionEngine/Functions/Implementations/LogicalComparisonFunctions/IfFunction.cs +++ b/ExpressionEngine/Functions/Implementations/LogicalComparisonFunctions/IfFunction.cs @@ -3,6 +3,7 @@ namespace ExpressionEngine.Functions.Implementations.LogicalComparisonFunctions { + [FunctionRegistration("if")] public class IfFunction : IFunction { public ValueTask ExecuteFunction(params ValueContainer[] parameters) diff --git a/ExpressionEngine/Functions/Implementations/LogicalComparisonFunctions/LessFunction.cs b/ExpressionEngine/Functions/Implementations/LogicalComparisonFunctions/LessFunction.cs index 79a35fb..c708a37 100644 --- a/ExpressionEngine/Functions/Implementations/LogicalComparisonFunctions/LessFunction.cs +++ b/ExpressionEngine/Functions/Implementations/LogicalComparisonFunctions/LessFunction.cs @@ -4,6 +4,7 @@ namespace ExpressionEngine.Functions.Implementations.LogicalComparisonFunctions { + [FunctionRegistration("less")] public class LessFunction : IFunction { public ValueTask ExecuteFunction(params ValueContainer[] parameters) diff --git a/ExpressionEngine/Functions/Implementations/LogicalComparisonFunctions/LessOrEqualsFunction.cs b/ExpressionEngine/Functions/Implementations/LogicalComparisonFunctions/LessOrEqualsFunction.cs index 52778d1..4b8e2a0 100644 --- a/ExpressionEngine/Functions/Implementations/LogicalComparisonFunctions/LessOrEqualsFunction.cs +++ b/ExpressionEngine/Functions/Implementations/LogicalComparisonFunctions/LessOrEqualsFunction.cs @@ -4,6 +4,7 @@ namespace ExpressionEngine.Functions.Implementations.LogicalComparisonFunctions { + [FunctionRegistration("lessOrEquals")] public class LessOrEqualsFunction : IFunction { public ValueTask ExecuteFunction(params ValueContainer[] parameters) diff --git a/ExpressionEngine/Functions/Implementations/LogicalComparisonFunctions/NotFunction.cs b/ExpressionEngine/Functions/Implementations/LogicalComparisonFunctions/NotFunction.cs index 3262e5e..e724a4d 100644 --- a/ExpressionEngine/Functions/Implementations/LogicalComparisonFunctions/NotFunction.cs +++ b/ExpressionEngine/Functions/Implementations/LogicalComparisonFunctions/NotFunction.cs @@ -4,6 +4,7 @@ namespace ExpressionEngine.Functions.Implementations.LogicalComparisonFunctions { + [FunctionRegistration("not")] public class NotFunction : IFunction { public ValueTask ExecuteFunction(params ValueContainer[] parameters) diff --git a/ExpressionEngine/Functions/Implementations/LogicalComparisonFunctions/OrFunction.cs b/ExpressionEngine/Functions/Implementations/LogicalComparisonFunctions/OrFunction.cs index f91b02e..4c994aa 100644 --- a/ExpressionEngine/Functions/Implementations/LogicalComparisonFunctions/OrFunction.cs +++ b/ExpressionEngine/Functions/Implementations/LogicalComparisonFunctions/OrFunction.cs @@ -4,6 +4,7 @@ namespace ExpressionEngine.Functions.Implementations.LogicalComparisonFunctions { + [FunctionRegistration("or")] public class OrFunction : IFunction { public ValueTask ExecuteFunction(params ValueContainer[] parameters) diff --git a/ExpressionEngine/Functions/Implementations/Math/AddFunction.cs b/ExpressionEngine/Functions/Implementations/Math/AddFunction.cs index 280e2f9..cbc82f3 100644 --- a/ExpressionEngine/Functions/Implementations/Math/AddFunction.cs +++ b/ExpressionEngine/Functions/Implementations/Math/AddFunction.cs @@ -4,6 +4,7 @@ namespace ExpressionEngine.Functions.Math { + [FunctionRegistration("add")] public class AddFunction : IFunction { /// add diff --git a/ExpressionEngine/Functions/Implementations/Math/DivFunction.cs b/ExpressionEngine/Functions/Implementations/Math/DivFunction.cs index 7eecab4..4f232c4 100644 --- a/ExpressionEngine/Functions/Implementations/Math/DivFunction.cs +++ b/ExpressionEngine/Functions/Implementations/Math/DivFunction.cs @@ -4,6 +4,7 @@ namespace ExpressionEngine.Functions.Math { + [FunctionRegistration("div")] public class DivFunction : IFunction { /// div diff --git a/ExpressionEngine/Functions/Implementations/Math/MaxFunction.cs b/ExpressionEngine/Functions/Implementations/Math/MaxFunction.cs index 6171012..d822fae 100644 --- a/ExpressionEngine/Functions/Implementations/Math/MaxFunction.cs +++ b/ExpressionEngine/Functions/Implementations/Math/MaxFunction.cs @@ -6,6 +6,7 @@ namespace ExpressionEngine.Functions.Math { + [FunctionRegistration("max")] public class MaxFunction : IFunction { /// max diff --git a/ExpressionEngine/Functions/Implementations/Math/MinFunction.cs b/ExpressionEngine/Functions/Implementations/Math/MinFunction.cs index af30857..a5d30f3 100644 --- a/ExpressionEngine/Functions/Implementations/Math/MinFunction.cs +++ b/ExpressionEngine/Functions/Implementations/Math/MinFunction.cs @@ -6,6 +6,7 @@ namespace ExpressionEngine.Functions.Math { + [FunctionRegistration("min")] public class MinFunction : IFunction { /// min diff --git a/ExpressionEngine/Functions/Implementations/Math/ModFunction.cs b/ExpressionEngine/Functions/Implementations/Math/ModFunction.cs index 6211102..1060e6c 100644 --- a/ExpressionEngine/Functions/Implementations/Math/ModFunction.cs +++ b/ExpressionEngine/Functions/Implementations/Math/ModFunction.cs @@ -4,6 +4,7 @@ namespace ExpressionEngine.Functions.Math { + [FunctionRegistration("mod")] public class ModFunction : IFunction { /// mod diff --git a/ExpressionEngine/Functions/Implementations/Math/MulFunction.cs b/ExpressionEngine/Functions/Implementations/Math/MulFunction.cs index f26dadf..5616db6 100644 --- a/ExpressionEngine/Functions/Implementations/Math/MulFunction.cs +++ b/ExpressionEngine/Functions/Implementations/Math/MulFunction.cs @@ -4,6 +4,7 @@ namespace ExpressionEngine.Functions.Math { + [FunctionRegistration("mul")] public class MulFunction : IFunction { /// mul diff --git a/ExpressionEngine/Functions/Implementations/Math/RandFunction.cs b/ExpressionEngine/Functions/Implementations/Math/RandFunction.cs index 4446571..1eeb0d4 100644 --- a/ExpressionEngine/Functions/Implementations/Math/RandFunction.cs +++ b/ExpressionEngine/Functions/Implementations/Math/RandFunction.cs @@ -5,6 +5,7 @@ namespace ExpressionEngine.Functions.Math { + [FunctionRegistration("rand")] public class RandFunction : IFunction { /// rand diff --git a/ExpressionEngine/Functions/Implementations/Math/RangeFunction.cs b/ExpressionEngine/Functions/Implementations/Math/RangeFunction.cs index d5b4112..a1510da 100644 --- a/ExpressionEngine/Functions/Implementations/Math/RangeFunction.cs +++ b/ExpressionEngine/Functions/Implementations/Math/RangeFunction.cs @@ -5,6 +5,7 @@ namespace ExpressionEngine.Functions.Math { + [FunctionRegistration("range")] public class RangeFunction : IFunction { /// range diff --git a/ExpressionEngine/Functions/Implementations/Math/SubFunction.cs b/ExpressionEngine/Functions/Implementations/Math/SubFunction.cs index e8bcb49..01e3c7a 100644 --- a/ExpressionEngine/Functions/Implementations/Math/SubFunction.cs +++ b/ExpressionEngine/Functions/Implementations/Math/SubFunction.cs @@ -4,6 +4,7 @@ namespace ExpressionEngine.Functions.Math { + [FunctionRegistration("sub")] public class SubFunction : IFunction { /// sub diff --git a/ExpressionEngine/Functions/Implementations/StringFunctions/ConcatFunction.cs b/ExpressionEngine/Functions/Implementations/StringFunctions/ConcatFunction.cs index 39458e7..5431140 100644 --- a/ExpressionEngine/Functions/Implementations/StringFunctions/ConcatFunction.cs +++ b/ExpressionEngine/Functions/Implementations/StringFunctions/ConcatFunction.cs @@ -5,6 +5,7 @@ namespace ExpressionEngine.Functions.Implementations.StringFunctions { + [FunctionRegistration("concat")] public class ConcatFunction : IFunction { /// concat diff --git a/ExpressionEngine/Functions/Implementations/StringFunctions/EndsWithFunction.cs b/ExpressionEngine/Functions/Implementations/StringFunctions/EndsWithFunction.cs index cb6c93f..2115cf1 100644 --- a/ExpressionEngine/Functions/Implementations/StringFunctions/EndsWithFunction.cs +++ b/ExpressionEngine/Functions/Implementations/StringFunctions/EndsWithFunction.cs @@ -4,6 +4,7 @@ namespace ExpressionEngine.Functions.Implementations.StringFunctions { + [FunctionRegistration("endsWith")] public class EndsWithFunction : IFunction { /// endsWith diff --git a/ExpressionEngine/Functions/Implementations/StringFunctions/FormatNumberFunction.cs b/ExpressionEngine/Functions/Implementations/StringFunctions/FormatNumberFunction.cs index 341ae7c..077fa2d 100644 --- a/ExpressionEngine/Functions/Implementations/StringFunctions/FormatNumberFunction.cs +++ b/ExpressionEngine/Functions/Implementations/StringFunctions/FormatNumberFunction.cs @@ -5,6 +5,7 @@ namespace ExpressionEngine.Functions.Implementations.StringFunctions { + [FunctionRegistration("formatNumber")] public class FormatNumberFunction : IFunction { /// formatNumber diff --git a/ExpressionEngine/Functions/Implementations/StringFunctions/GuidFunction.cs b/ExpressionEngine/Functions/Implementations/StringFunctions/GuidFunction.cs index 4ef3641..de8b4dc 100644 --- a/ExpressionEngine/Functions/Implementations/StringFunctions/GuidFunction.cs +++ b/ExpressionEngine/Functions/Implementations/StringFunctions/GuidFunction.cs @@ -6,6 +6,7 @@ namespace ExpressionEngine.Functions.Implementations.StringFunctions { + [FunctionRegistration("guid")] public class GuidFunction : IFunction { public ValueTask ExecuteFunction(params ValueContainer[] parameters) diff --git a/ExpressionEngine/Functions/Implementations/StringFunctions/IndexOfFunction.cs b/ExpressionEngine/Functions/Implementations/StringFunctions/IndexOfFunction.cs index 338aa83..59ee0ac 100644 --- a/ExpressionEngine/Functions/Implementations/StringFunctions/IndexOfFunction.cs +++ b/ExpressionEngine/Functions/Implementations/StringFunctions/IndexOfFunction.cs @@ -5,6 +5,7 @@ namespace ExpressionEngine.Functions.Implementations.StringFunctions { + [FunctionRegistration("indexOf")] public class IndexOfFunction : IFunction { public ValueTask ExecuteFunction(params ValueContainer[] parameters) diff --git a/ExpressionEngine/Functions/Implementations/StringFunctions/LastIndexOfFunction.cs b/ExpressionEngine/Functions/Implementations/StringFunctions/LastIndexOfFunction.cs index 8ad0432..321ad3d 100644 --- a/ExpressionEngine/Functions/Implementations/StringFunctions/LastIndexOfFunction.cs +++ b/ExpressionEngine/Functions/Implementations/StringFunctions/LastIndexOfFunction.cs @@ -5,6 +5,7 @@ namespace ExpressionEngine.Functions.Implementations.StringFunctions { + [FunctionRegistration("lastIndexOf")] public class LastIndexOfFunction : IFunction { public ValueTask ExecuteFunction(params ValueContainer[] parameters) diff --git a/ExpressionEngine/Functions/Implementations/StringFunctions/LengthFunction.cs b/ExpressionEngine/Functions/Implementations/StringFunctions/LengthFunction.cs index f836986..7ec45f6 100644 --- a/ExpressionEngine/Functions/Implementations/StringFunctions/LengthFunction.cs +++ b/ExpressionEngine/Functions/Implementations/StringFunctions/LengthFunction.cs @@ -7,6 +7,7 @@ namespace ExpressionEngine.Functions.Implementations.StringFunctions { + [FunctionRegistration("length")] public class LengthFunction : IFunction { /// length diff --git a/ExpressionEngine/Functions/Implementations/StringFunctions/ReplaceFunction.cs b/ExpressionEngine/Functions/Implementations/StringFunctions/ReplaceFunction.cs index 9c40584..c033b7f 100644 --- a/ExpressionEngine/Functions/Implementations/StringFunctions/ReplaceFunction.cs +++ b/ExpressionEngine/Functions/Implementations/StringFunctions/ReplaceFunction.cs @@ -4,6 +4,7 @@ namespace ExpressionEngine.Functions.Implementations.StringFunctions { + [FunctionRegistration("replace")] public class ReplaceFunction : IFunction { /// replace diff --git a/ExpressionEngine/Functions/Implementations/StringFunctions/SplitFunction.cs b/ExpressionEngine/Functions/Implementations/StringFunctions/SplitFunction.cs index 7ea04a1..f090320 100644 --- a/ExpressionEngine/Functions/Implementations/StringFunctions/SplitFunction.cs +++ b/ExpressionEngine/Functions/Implementations/StringFunctions/SplitFunction.cs @@ -6,6 +6,7 @@ namespace ExpressionEngine.Functions.Implementations.StringFunctions { + [FunctionRegistration("split")] public class SplitFunction : IFunction { /// split diff --git a/ExpressionEngine/Functions/Implementations/StringFunctions/StartsWithFunction.cs b/ExpressionEngine/Functions/Implementations/StringFunctions/StartsWithFunction.cs index d965106..1649ce6 100644 --- a/ExpressionEngine/Functions/Implementations/StringFunctions/StartsWithFunction.cs +++ b/ExpressionEngine/Functions/Implementations/StringFunctions/StartsWithFunction.cs @@ -4,6 +4,7 @@ namespace ExpressionEngine.Functions.Implementations.StringFunctions { + [FunctionRegistration("startsWith")] public class StartsWithFunction : IFunction { /// startsWith diff --git a/ExpressionEngine/Functions/Implementations/StringFunctions/SubstringFunction.cs b/ExpressionEngine/Functions/Implementations/StringFunctions/SubstringFunction.cs index 2b4c01a..68001e6 100644 --- a/ExpressionEngine/Functions/Implementations/StringFunctions/SubstringFunction.cs +++ b/ExpressionEngine/Functions/Implementations/StringFunctions/SubstringFunction.cs @@ -4,6 +4,7 @@ namespace ExpressionEngine.Functions.Implementations.StringFunctions { + [FunctionRegistration("substring")] public class SubstringFunction : IFunction { /// substring diff --git a/ExpressionEngine/Functions/Implementations/StringFunctions/ToLowerFunction.cs b/ExpressionEngine/Functions/Implementations/StringFunctions/ToLowerFunction.cs index acf7b4e..24db9ef 100644 --- a/ExpressionEngine/Functions/Implementations/StringFunctions/ToLowerFunction.cs +++ b/ExpressionEngine/Functions/Implementations/StringFunctions/ToLowerFunction.cs @@ -4,6 +4,7 @@ namespace ExpressionEngine.Functions.Implementations.StringFunctions { + [FunctionRegistration("toLower")] public class ToLowerFunction : IFunction { /// toLower diff --git a/ExpressionEngine/Functions/Implementations/StringFunctions/ToUpperFunction.cs b/ExpressionEngine/Functions/Implementations/StringFunctions/ToUpperFunction.cs index d43d528..575b789 100644 --- a/ExpressionEngine/Functions/Implementations/StringFunctions/ToUpperFunction.cs +++ b/ExpressionEngine/Functions/Implementations/StringFunctions/ToUpperFunction.cs @@ -4,6 +4,7 @@ namespace ExpressionEngine.Functions.Implementations.StringFunctions { + [FunctionRegistration("toUpper")] public class ToUpperFunction : IFunction { /// toUpper diff --git a/ExpressionEngine/Functions/Implementations/StringFunctions/TrimFunction.cs b/ExpressionEngine/Functions/Implementations/StringFunctions/TrimFunction.cs index 3b6558c..59c3a60 100644 --- a/ExpressionEngine/Functions/Implementations/StringFunctions/TrimFunction.cs +++ b/ExpressionEngine/Functions/Implementations/StringFunctions/TrimFunction.cs @@ -4,6 +4,7 @@ namespace ExpressionEngine.Functions.Implementations.StringFunctions { + [FunctionRegistration("trim")] public class TrimFunction : IFunction { public ValueTask ExecuteFunction(params ValueContainer[] parameters) diff --git a/ExpressionEngine/Rules/StringLiteralRule.cs b/ExpressionEngine/Rules/StringLiteralRule.cs index 13cd606..6bed784 100644 --- a/ExpressionEngine/Rules/StringLiteralRule.cs +++ b/ExpressionEngine/Rules/StringLiteralRule.cs @@ -2,20 +2,27 @@ namespace ExpressionEngine.Rules { + /// public class StringLiteralRule : IRule { private readonly ValueContainer _content; + /// + /// Represents string literals, i.e. 'Hello World!' + /// + /// String value public StringLiteralRule(ValueContainer content) { _content = content; } + /// public ValueTask Evaluate() { return new ValueTask(_content); } + /// public string PrettyPrint() { return $"'{_content}'"; diff --git a/ExpressionEngine/Scope.cs b/ExpressionEngine/Scope.cs new file mode 100644 index 0000000..b257634 --- /dev/null +++ b/ExpressionEngine/Scope.cs @@ -0,0 +1,23 @@ +namespace ExpressionEngine +{ + /// + /// Representing the scopes available for dependency injection + /// + public enum Scope + { + /// + /// Scoped + /// + Scoped, + + /// + /// Transient + /// + Transient, + + /// + /// Singleton + /// + Singleton + } +} \ No newline at end of file diff --git a/ExpressionEngine/ValueContainer.cs b/ExpressionEngine/ValueContainer.cs index bf151f2..f107b2e 100644 --- a/ExpressionEngine/ValueContainer.cs +++ b/ExpressionEngine/ValueContainer.cs @@ -1,5 +1,4 @@ using System; -using System.Collections; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; @@ -18,6 +17,16 @@ public class ValueContainer : IComparable, IEquatable private readonly object _value; private readonly ValueType _type; + /// + /// + /// + /// + /// + public static implicit operator ValueContainer(string value) + { + return new ValueContainer(value); + } + /// /// Creates Value Container from string /// @@ -62,60 +71,100 @@ public ValueContainer(string value, bool tryToParse = false) } } + /// + /// Construct string ValueContainer + /// + /// ValueContainer content public ValueContainer(string stringValue) { _value = stringValue; _type = ValueType.String; } + /// + /// Construct Guid ValueContainer + /// + /// ValueContainer content public ValueContainer(Guid guid) { _value = guid; _type = ValueType.Guid; } + /// + /// Construct Date ValueContainer + /// + /// ValueContainer content public ValueContainer(DateTimeOffset dateTime) { _value = dateTime; _type = ValueType.Date; } + /// + /// Construct decimal ValueContainer from float + /// + /// ValueContainer content public ValueContainer(float floatValue) { _value = Convert.ToDecimal(floatValue); _type = ValueType.Float; } + /// + /// Construct decimal ValueContainer + /// + /// ValueContainer content public ValueContainer(decimal floatValue) { _value = floatValue; _type = ValueType.Float; } + /// + /// Construct float ValueContainer from double + /// + /// ValueContainer content public ValueContainer(double floatValue) { _value = Convert.ToDecimal(floatValue); _type = ValueType.Float; } + /// + /// Construct int ValueContainer + /// + /// ValueContainer content public ValueContainer(int intValue) { _value = intValue; _type = ValueType.Integer; } + /// + /// Construct boolean ValueContainer + /// + /// ValueContainer content public ValueContainer(bool boolValue) { _value = boolValue; _type = ValueType.Boolean; } + /// + /// Construct Array ValueContainer + /// + /// ValueContainer content public ValueContainer(List arrayValue) { _value = arrayValue; _type = ValueType.Array; } + /// + /// Construct Array ValueContainer + /// + /// ValueContainer content public ValueContainer(IEnumerable arrayValue) { _value = arrayValue.ToList(); @@ -129,29 +178,48 @@ internal ValueContainer(Dictionary objectValue, bool nor _type = ValueType.Object; } + /// + /// Construct Object ValueContainer + /// + /// ValueContainer content public ValueContainer(Dictionary objectValue) { _value = objectValue.Normalize(); _type = ValueType.Object; } + /// + /// Construct ValueContainer copied from another ValueContainer + /// + /// ValueContainer content public ValueContainer(ValueContainer valueContainer) { _type = valueContainer._type; _value = valueContainer._value; } + /// + /// Construct Null ValueContainer + /// public ValueContainer() { _type = ValueType.Null; _value = null; } + /// + /// Type of the value within the ValueContainer + /// + /// public ValueType Type() { return _type; } + /// + /// Check if value in ValueContainer is a number + /// + /// true if number else false public bool IsNumber() { return _type == ValueType.Float || _type == ValueType.Integer; @@ -196,6 +264,11 @@ public T GetValue() $"Cannot convert ValueContainer of type {_value.GetType()} to {typeof(T)}"); } + /// + /// Access i'th element of array + /// + /// index + /// Is thrown is this is not an array public ValueContainer this[int i] { get @@ -218,6 +291,11 @@ public ValueContainer this[int i] } } + /// + /// Access element in object by key + /// + /// key of element tor retrieve + /// Is thrown is this is not an object public ValueContainer this[string key] { get @@ -268,6 +346,11 @@ public ValueContainer this[string key] } } + /// + /// Return value of ValueContainer as Dictionary + /// + /// Value as Dictionary + /// Is thrown is this is not an Object public Dictionary AsDict() { if (_type == ValueType.Object) @@ -278,6 +361,11 @@ public Dictionary AsDict() throw new ExpressionEngineException("Can't get none object value container as dict."); } + /// + /// Return value of ValueCOntianer as List + /// + /// Value as List + /// Is thrown is this is not an Array public List AsList() { if (_type == ValueType.Array) @@ -311,11 +399,16 @@ public override string ToString() }; } + /// + /// Check if ValueContainer is of type null + /// + /// boolean public bool IsNull() { return _type == ValueType.Null; } + /// public int CompareTo(object? obj) { if (obj == null || obj.GetType() != GetType()) @@ -353,6 +446,7 @@ public int CompareTo(object? obj) } } + /// public bool Equals(ValueContainer other) { if (ReferenceEquals(null, other)) return false; @@ -384,6 +478,7 @@ public bool Equals(ValueContainer other) } } + /// public override bool Equals(object obj) { if (ReferenceEquals(null, obj)) return false; @@ -391,11 +486,19 @@ public override bool Equals(object obj) return obj.GetType() == GetType() && Equals((ValueContainer) obj); } + /// public override int GetHashCode() { return new {_type, _value}.GetHashCode(); } + /// + /// Check if ValueContainer of type Object contains the given key + /// + /// Key is split according to '/' + /// + /// key or path + /// boolean public bool ContainsKey(string key) { if (_type != ValueType.Object) return false; diff --git a/Test/NullCoalescingTest.cs b/Test/NullCoalescingTest.cs index 33ec23e..7bd3168 100644 --- a/Test/NullCoalescingTest.cs +++ b/Test/NullCoalescingTest.cs @@ -20,7 +20,7 @@ private IServiceProvider BuildServiceProvider() { var services = new ServiceCollection(); services.AddExpressionEngine(); - services.RegisterScopedFunctionAlias("variables"); + services.BuildFunction().WithAlias("variables").AsScoped().Add(); _serviceProvider = services.BuildServiceProvider(); } diff --git a/Test/NullCoalescingTest2.cs b/Test/NullCoalescingTest2.cs index b6abe90..a64c929 100644 --- a/Test/NullCoalescingTest2.cs +++ b/Test/NullCoalescingTest2.cs @@ -20,6 +20,7 @@ public void Setup() t.RegisterTransientFunctionAlias("dummy"); _returnData = new ReturnData(); t.RegisterScopedFunctionAlias("returnData", _ => _returnData); + t.RegisterScopedFunctionAlias("returnData", _ => _returnData); t.BuildServiceProvider().GetService(); t.AddSingleton(); diff --git a/Test/ParserTest.cs b/Test/ParserTest.cs index 05e3f92..4550c11 100644 --- a/Test/ParserTest.cs +++ b/Test/ParserTest.cs @@ -14,11 +14,12 @@ public class AsynctestFunction : IFunction { public async ValueTask ExecuteFunction(params ValueContainer[] parameters) { - await Task.Delay((int) (new Random().NextDouble()* 10000)); + await Task.Delay((int) (new Random().NextDouble() * 10000)); return new ValueContainer("Hello World"); } } - + + [FunctionRegistration("asynctest")] public class NonExistingFunction1 : IFunction { public async ValueTask ExecuteFunction(params ValueContainer[] parameters) @@ -27,7 +28,7 @@ public async ValueTask ExecuteFunction(params ValueContainer[] p } } - + [TestFixture] public class ParserTest { @@ -35,8 +36,8 @@ private ServiceProvider BuildServiceProvider() { var services = new ServiceCollection(); services.AddExpressionEngine(); - services.RegisterTransientFunctionAlias("asynctest"); - services.AddSingleton(_ => new FunctionMetadata(typeof(NonExistingFunction1),"nonExistingFunction1")); + services.AddFunction(); + services.AddSingleton(_ => new FunctionMetadata(typeof(NonExistingFunction1), "nonExistingFunction1")); return services.BuildServiceProvider(); } @@ -95,8 +96,8 @@ public async Task TestSimpleInput(TestInput testInput) new ValueContainer("Just a simple string without an exceptions")), new TestInput("tst@delegate.dk", new ValueContainer("tst@delegate.dk")), new TestInput( - "@{toLower(\'user@DOMAIN.dk\')} - Send me an email or call on 8888 8888!", new ValueContainer( - "user@domain.dk - Send me an email or call on 8888 8888!") + "Email: @{toLower(\'user@DOMAIN.dk\')} - Send me an email or call on 8888 8888!", new ValueContainer( + "Email: user@domain.dk - Send me an email or call on 8888 8888!") ), new TestInput("@concat(\'Hi you,\',\' Alice B.\')", new ValueContainer("Hi you, Alice B.")), new TestInput( @@ -114,8 +115,6 @@ public async Task TestSimpleInput(TestInput testInput) new TestInput("@greater(10.1, 10.0)", new ValueContainer(true)), new TestInput("@greater(10.1, 10)", new ValueContainer(true)), new TestInput("@add(10,0.5)", new ValueContainer(10.5)), - - }; #endregion @@ -137,7 +136,6 @@ public async Task TestAsync(TestInput testInput) new ValueContainer("Hello World - Hello World - Hello World")), }; - public class TestInput { @@ -146,6 +144,7 @@ public TestInput(string input, ValueContainer expectedOutput) Input = input; ExpectedOutput = expectedOutput; } + public ValueContainer[] ValueContainers { get; set; } public string Input { get; set; } public ValueContainer ExpectedOutput { get; set; }