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
}
}