// Author: Orlys
// Github: https://github.com/Orlys
namespace Yuuna.Contracts.Modules
{
using System;
using System.Collections.Immutable;
using System.Reflection;
using System.Runtime.Loader;
using Yuuna.Contracts.Optimization;
using Yuuna.Contracts.Patterns;
using Yuuna.Contracts.Semantics;
using Yuuna.Contracts.TextSegmention;
///
/// 模組狀態。
///
public enum ModuleStatus
{
///
/// 未初始化。
///
Uninitialized,
///
/// 初始化失敗。
///
FailToInitialize,
///
/// 初始化完成。
///
Initialized,
}
internal interface IModule
{
IPatternSet Patterns { get; }
}
public abstract class ModuleBase
{
protected virtual string ModuleName { get; }
private readonly PatternFactory _patternfactory;
internal IPatternSet Patterns => this._patternfactory;
public ModuleBase()
{
this._patternfactory = new PatternFactory(this);
this.ModuleName = this.GetType().Name;
this.Status = ModuleStatus.Uninitialized;
}
///
/// 模組名稱。
///
public string Name
{
get
{
var t = this.GetType();
var getMethod = t.GetProperty(nameof(this.ModuleName), (BindingFlags)52).GetGetMethod(true);
if (!getMethod.GetBaseDefinition().Equals(getMethod))
{
try
{
var test = this.ModuleName;
if (!string.IsNullOrWhiteSpace(test))
{
return test;
}
}
catch
{
}
return t.Name;
}
else
return this.ModuleName;
}
}
///
/// 表示模組是否已初始化。
///
public ModuleStatus Status { get; private set; }
///
/// 初始化模組
///
/// 分詞器
/// 群組管理
internal void Initialize(ITextSegmenter textSegmenter, IGroupManager groupManager)
{
if (this.Status.Equals(ModuleStatus.Uninitialized))
{
try
{
this.BuildPatterns(groupManager, this._patternfactory);
textSegmenter.Load(groupManager);
this.Status = ModuleStatus.Initialized;
this.AfterInitialize();
}
catch //(Exception e)
{
this.Status = ModuleStatus.FailToInitialize;
}
}
}
///
/// 在初始化後引發。
///
protected virtual void AfterInitialize()
{
}
///
/// 建立模式規則。
///
///
///
protected abstract void BuildPatterns(IGroupManager g, IPatternBuilder p);
}
}