using System; using IronPython.Runtime; using Microsoft.Scripting.Hosting; namespace MQTTnet.Server.Scripting { public class PythonScriptInstance { private readonly ScriptScope _scriptScope; public PythonScriptInstance(string uid, string path, ScriptScope scriptScope) { Uid = uid; Path = path; _scriptScope = scriptScope; } public string Uid { get; } public string Path { get; } public bool InvokeOptionalFunction(string name, params object[] parameters) { return InvokeOptionalFunction(name, parameters, out _); } public bool InvokeOptionalFunction(string name, object[] parameters, out object result) { if (name == null) throw new ArgumentNullException(nameof(name)); lock (_scriptScope) { if (!_scriptScope.Engine.Operations.TryGetMember(_scriptScope, name, out var member)) { result = null; return false; } if (!(member is PythonFunction function)) { throw new Exception($"Member '{name}' is no Python function."); } try { result = _scriptScope.Engine.Operations.Invoke(function, parameters); return true; } catch (Exception exception) { var details = _scriptScope.Engine.GetService().FormatException(exception); var message = $"Error while invoking function '{name}'. " + Environment.NewLine + details; throw new Exception(message, exception); } } } } }