private ShibaFunction ParseFunction(ShibaFunction item, IShibaContext context) { for (var i = 0; i < item.Parameters.Count; i++) { var parameter = item.Parameters[i]; switch (parameter) { case ShibaFunction function: item.Parameters[i] = ParseFunction(function, context); break; case ShibaExtension extension: var executor = ShibaApp.Instance.Configuration.ExtensionExecutors .FirstOrDefault(it => it.Name == extension.Type); if (executor is IMutableExtensionExecutor) { item.Parameters[i] = executor.ProvideValue(context, extension); } break; default: item.Parameters[i] = DynamicVisit(parameter, context); break; } } return(item); }
private IEnumerable <ShibaExtension> GetExtensions(ShibaFunction function) { foreach (var item in function.Parameters) { switch (item) { case ShibaExtension extension: { var executor = ShibaApp.Instance.Configuration.ExtensionExecutors .FirstOrDefault(it => it.Name == extension.Type); if (!(executor is IMutableExtensionExecutor)) { yield return(extension); } } break; case ShibaFunction shibaFunction: foreach (var extension in GetExtensions(shibaFunction)) { yield return(extension); } break; } } }
private NativeBinding Visit(ShibaFunction item, IShibaContext context) { var function = ParseFunction(item, context); var extensions = GetExtensions(function)?.ToList(); if (extensions == null || !extensions.Any()) { return new NativeBinding { ConverterParameter = Singleton <ShibaFunctionExecutor> .Instance.Execute(function, null), Converter = Singleton <RawDataConverter> .Instance } } ; if (extensions.Count == 1) { var extension = extensions.FirstOrDefault(); var extensionValue = DynamicVisit(extension, context); switch (extensionValue) { case NativeBinding binding: if (binding.Converter != null) { binding.ConverterParameter = new ShibaConverterParameter { InnerConverter = binding.Converter, InnerParameter = binding.ConverterParameter, Function = function } } ; else { binding.ConverterParameter = function; } binding.Converter = Singleton <SingleBindingFunctionConverter> .Instance; return(binding); default: return(new NativeBinding { ConverterParameter = Singleton <SingleBindingShibaFunctionExecutor> .Instance.Execute(function, extensionValue), Converter = Singleton <RawDataConverter> .Instance }); } } if (extensions.Count > 1) { throw new ArgumentOutOfRangeException("Currently only support single ShibaExtension"); } throw new ArgumentOutOfRangeException($"Can not handle function call ${item}"); }
public object Execute(ShibaFunction function, object dataContext) { if (ShibaApp.Instance.Configuration.NativeConverters.ContainsKey(function.Name)) { return(ShibaApp.Instance.Configuration.NativeConverters[function.Name] .Invoke(function.Parameters.Select(it => GetParameterValue(it, dataContext)).ToList())); } else { return(ShibaApp.Instance.Configuration.ScriptRuntime.CallFunction(function.Name, function.Parameters.Select(it => GetParameterValue(it, dataContext)).ToArray())); } }
private object Visit(ShibaExtension item, IShibaContext context) { var executor = ShibaApp.Instance.Configuration.ExtensionExecutors.FirstOrDefault(it => it.Name == item.Type); if (executor != null) { var value = executor.ProvideValue(context, item); if (string.IsNullOrEmpty(item.ScriptName)) { return(value); } var func = new ShibaFunction(item.ScriptName) { Parameters = { item } }; if (value is NativeBinding binding) { if (binding.Converter != null) { binding.ConverterParameter = new ShibaConverterParameter { InnerConverter = binding.Converter, InnerParameter = binding.ConverterParameter, Function = func } } ; else { binding.ConverterParameter = func; } binding.Converter = Singleton <SingleBindingFunctionConverter> .Instance; return(binding); } return(new NativeBinding { ConverterParameter = Singleton <SingleBindingShibaFunctionExecutor> .Instance.Execute(func, item), Converter = Singleton <RawDataConverter> .Instance }); } throw new NotImplementedException(); }