/* * Copyright (c) Facebook, Inc. and its affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ using System; using JavaScriptEngineSwitcher.Core; using JavaScriptEngineSwitcher.Core.Helpers; using Newtonsoft.Json; using React.Exceptions; namespace React { /// /// Various helper methods for the JavaScript engine environment. /// public static class JavaScriptEngineUtils { /// /// Executes a code from JavaScript file. /// /// Engine to execute code from JavaScript file /// File system wrapper /// Path to the JavaScript file public static void ExecuteFile(this IJsEngine engine, IFileSystem fileSystem, string path) { var contents = fileSystem.ReadAsString(path); engine.Execute(contents, path); } /// /// Calls a JavaScript function using the specified engine. If is /// not a scalar type, the function is assumed to return a string of JSON that can be /// parsed as that type. /// /// Type returned by function /// Engine to execute function with /// Name of the function to execute /// Arguments to pass to function /// Value returned by function public static T CallFunctionReturningJson(this IJsEngine engine, string function, params object[] args) { if (ValidationHelpers.IsSupportedType(typeof(T))) { // Type is supported directly (ie. a scalar type like string/int/bool) // Just execute the function directly. return engine.CallFunction(function, args); } // The type is not a scalar type. Assume the function will return its result as // JSON. var resultJson = engine.CallFunction(function, args); try { return JsonConvert.DeserializeObject(resultJson); } catch (JsonReaderException ex) { throw new ReactException(string.Format( "{0} did not return valid JSON: {1}.\n\n{2}", function, ex.Message, resultJson ), ex); } } } }