using System.Collections.Concurrent;
namespace etoy
{
///
/// 服务器代码生成命令
/// TypeScript + Json
///
class CmdExportServerCode : Command
{
private readonly List _errors = new List();
ConcurrentQueue _dones = new ConcurrentQueue();
int _totalStage;
public override string Description => "生成服务端的代码";
protected override void OnProcess()
{
_dones.Clear();
var generaters = new IGenerater[]
{
new TSXlsConfigGenerater(),
new TSGameCfgGenerater(),
new TSKeyValueTableGenerater(),
};
_totalStage = generaters.Length;
foreach (IGenerater generater in generaters)
Task.Factory.StartNew(OnThreadGen, generater);
Task.Factory.StartNew(OnLoop);
Task.Factory.StartNew(OnThreadLoop);
}
private void OnThreadLoop()
{
while (_dones.Count < _totalStage)
Thread.Sleep(10);
Completed();
}
private void OnThreadGen(object state)
{
try
{
var generater = state as IGenerater;
generater.Generate(Context);
_dones.Enqueue(generater.GetType().Name);
SetProgress(_dones.Count / (float)_totalStage);
}
catch (Exception e)
{
--_totalStage;
_errors.Add(e);
}
}
private void OnLoop()
{
while (_dones.Count < _totalStage)
{
Thread.Sleep(1);
}
if (_errors.Count > 0)
{
SetException(new Exception(string.Join('\n', (from e in _errors select $"## ERROR: {e}").ToArray())));
}
else
{
Completed();
}
}
}
}