using System; using JavaScriptEngineSwitcher.Core.Resources; namespace JavaScriptEngineSwitcher.Core { /// /// JS engine switcher /// public sealed class JsEngineSwitcher : IJsEngineSwitcher { /// /// Flag for whether to allow usage of the property /// private static bool _allowCurrentProperty = true; /// /// Default instance of JS engine switcher /// private static readonly Lazy _default = new Lazy(() => new JsEngineSwitcher()); /// /// Current instance of JS engine switcher /// private static IJsEngineSwitcher _current; /// /// Gets or sets a flag for whether to allow usage of the property /// /// /// Required to ensure the usage of an instance of the JS engine switcher that is registered by using /// the IServiceCollection interface. /// public static bool AllowCurrentProperty { get { return _allowCurrentProperty; } set { _allowCurrentProperty = value; } } /// /// Gets or sets a instance of JS engine switcher /// public static IJsEngineSwitcher Current { get { if (!_allowCurrentProperty) { throw new InvalidOperationException( Strings.Configuration_GettingFromJsEngineSwitcherCurrentPropertyForbidden); } return _current ?? _default.Value; } set { if (!_allowCurrentProperty) { throw new InvalidOperationException( Strings.Configuration_AssigningToJsEngineSwitcherCurrentPropertyForbidden); } _current = value; } } /// /// Gets a instance of JS engine switcher /// [Obsolete("Use a `Current` property")] public static IJsEngineSwitcher Instance { get { return Current; } } /// /// Constructs an instance of JS engine switcher /// public JsEngineSwitcher() : this(new JsEngineFactoryCollection()) { } /// /// Constructs an instance of JS engine switcher /// public JsEngineSwitcher(JsEngineFactoryCollection engineFactories) : this(engineFactories, string.Empty) { } /// /// Constructs an instance of JS engine switcher /// public JsEngineSwitcher(JsEngineFactoryCollection engineFactories, string defaultEngineName) { EngineFactories = engineFactories; DefaultEngineName = defaultEngineName; } #region IJsEngineSwitcher implementation /// public string DefaultEngineName { get; set; } /// public JsEngineFactoryCollection EngineFactories { get; private set; } /// public IJsEngine CreateEngine(string name) { IJsEngine engine; IJsEngineFactory engineFactory = EngineFactories.Get(name); if (engineFactory is not null) { engine = engineFactory.CreateEngine(); } else { throw new JsEngineNotFoundException( string.Format(Strings.Configuration_JsEngineFactoryNotFound, name)); } return engine; } /// public IJsEngine CreateDefaultEngine() { string defaultJsEngineName = DefaultEngineName; if (string.IsNullOrWhiteSpace(defaultJsEngineName)) { throw new InvalidOperationException(Strings.Configuration_DefaultJsEngineNameNotSpecified); } IJsEngine jsEngine = CreateEngine(defaultJsEngineName); return jsEngine; } #endregion } }