Exemple #1
0
        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);
        }
Exemple #2
0
        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;
                }
            }
        }
Exemple #3
0
        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}");
        }
Exemple #4
0
 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()));
     }
 }
Exemple #5
0
        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();
        }