Files
FSI.BT.IR.Tools/Kalk/Kalk.Core/KalkModule.cs
Maier Stephan SI b684704bf8 Sicherung
2023-01-20 16:09:00 +01:00

139 lines
4.0 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Scriban;
using Scriban.Parsing;
using Scriban.Runtime;
using Scriban.Syntax;
namespace Kalk.Core
{
public abstract class KalkModule : IScriptCustomFunction, IScriptObject
{
protected KalkModule() : this(null)
{
}
protected KalkModule(string name)
{
Name = name;
if (Name == null)
{
Name = this.GetType().Name;
if (Name.EndsWith("Module"))
{
Name = Name.Substring(0, Name.Length - "Module".Length);
}
}
Descriptors = new Dictionary<string, KalkDescriptor>();
Descriptor = new KalkDescriptor() { Names = { Name } };
}
public string Name { get; private set; }
public KalkEngine Engine { get; private set; }
public bool IsImported { get; private set; }
public bool IsBuiltin { get; protected set; }
public bool IsInitialized { get; private set; }
public KalkDescriptor Descriptor { get; private set; }
internal void Initialize(KalkEngine engine)
{
if (IsInitialized) return;
Engine = engine;
Initialize();
IsInitialized = true;
}
internal void InternalImport()
{
if (IsImported) return;
Import();
IsImported = true;
}
protected virtual void Initialize()
{
}
protected virtual void Import()
{
foreach (var descriptor in Descriptors)
{
Engine.Descriptors[descriptor.Key] = descriptor.Value;
}
}
public Dictionary<string, KalkDescriptor> Descriptors { get; }
int IScriptFunctionInfo.RequiredParameterCount => 0;
int IScriptFunctionInfo.ParameterCount => 0;
ScriptVarParamKind IScriptFunctionInfo.VarParamKind => ScriptVarParamKind.None;
Type IScriptFunctionInfo.ReturnType => typeof(object);
ScriptParameterInfo IScriptFunctionInfo.GetParameterInfo(int index) => throw new NotSupportedException("A module doesn't have any parameters.");
object IScriptCustomFunction.Invoke(TemplateContext context, ScriptNode callerContext, ScriptArray arguments, ScriptBlockStatement blockStatement)
{
if (!(callerContext.Parent is ScriptExpressionStatement))
{
return this;
}
var engine = (KalkEngine) context;
engine.WriteHighlightLine($"# Module {Name}");
return null;
}
ValueTask<object> IScriptCustomFunction.InvokeAsync(TemplateContext context, ScriptNode callerContext, ScriptArray arguments, ScriptBlockStatement blockStatement)
{
return new ValueTask<object>(((IScriptCustomFunction)this).Invoke(context, callerContext, arguments, blockStatement));
}
int IScriptObject.Count => 0;
IEnumerable<string> IScriptObject.GetMembers() => Enumerable.Empty<string>();
bool IScriptObject.Contains(string member) => false;
bool IScriptObject.IsReadOnly
{
get => true;
set
{
}
}
bool IScriptObject.TryGetValue(TemplateContext context, SourceSpan span, string member, out object value)
{
value = null;
return false;
}
bool IScriptObject.CanWrite(string member) => false;
bool IScriptObject.TrySetValue(TemplateContext context, SourceSpan span, string member, object value, bool readOnly) => false;
bool IScriptObject.Remove(string member) => false;
void IScriptObject.SetReadOnly(string member, bool readOnly)
{
}
IScriptObject IScriptObject.Clone(bool deep)
{
throw new NotSupportedException("A module does not support the clone operation.");
}
}
}