using Serein.Library;
using Serein.Library.Api;
using Serein.NodeFlow.Model;
using Serein.NodeFlow.Model.Nodes;
using System.Diagnostics.CodeAnalysis;
namespace Serein.NodeFlow.Services
{
///
/// 流程模型服务
///
public class FlowModelService
{
private readonly IFlowEnvironment environment;
private readonly FlowLibraryService flowLibraryService;
///
/// 流程模型服务构造函数
///
///
///
public FlowModelService(IFlowEnvironment environment, FlowLibraryService flowLibraryService)
{
this.environment = environment;
this.flowLibraryService = flowLibraryService;
}
///
/// 环境加载的节点集合
/// Node Guid - Node Model
///
private Dictionary NodeModels { get; } = [];
///
/// 运行环境加载的画布集合
///
private Dictionary FlowCanvass { get; } = [];
///
/// 存放触发器节点(运行时全部调用)
///
private List FlipflopNodes { get; } = [];
///
/// 获取节点模型
///
///
///
public IFlowNode? GetNodeModel(string guid)
{
NodeModels.TryGetValue(guid, out var nodeModel);
return nodeModel;
}
///
/// 获取画布模型
///
///
///
public FlowCanvasDetails? GetCanvasModel(string guid)
{
FlowCanvass.TryGetValue(guid, out var nodeModel);
return nodeModel;
}
///
/// 尝试获取节点模型
///
///
///
///
public bool TryGetNodeModel(string guid, [NotNullWhen(true)] out IFlowNode? flowNode)
{
return NodeModels.TryGetValue(guid, out flowNode!);
}
///
/// 尝试获取画布模型
///
///
///
///
public bool TryGetCanvasModel(string guid, [NotNullWhen(true)] out FlowCanvasDetails? flowCanvas)
{
if(FlowCanvass.TryGetValue(guid, out var details))
{
flowCanvas = details;
return true;
}
flowCanvas = details;
return false;
}
///
/// 检查是否包含节点模型
///
///
///
public bool ContainsNodeModel(string guid)
{
return NodeModels.ContainsKey(guid);
}
///
/// 检查是否包含画布模型
///
///
///
public bool ContainsCanvasModel(string guid)
{
return FlowCanvass.ContainsKey(guid);
}
///
/// 添加节点模型
///
///
///
public bool AddNodeModel(IFlowNode flowNode)
{
ArgumentNullException.ThrowIfNull(flowNode);
ArgumentNullException.ThrowIfNull(flowNode.Guid);
return NodeModels.TryAdd(flowNode.Guid, flowNode);
}
///
/// 添加画布模型
///
///
///
public bool AddCanvasModel(FlowCanvasDetails flowCanvasDetails)
{
ArgumentNullException.ThrowIfNull(flowCanvasDetails);
ArgumentNullException.ThrowIfNull(flowCanvasDetails.Guid);
return FlowCanvass.TryAdd(flowCanvasDetails.Guid, flowCanvasDetails);
}
///
/// 移除节点模型
///
///
///
public bool RemoveNodeModel(IFlowNode flowNode)
{
ArgumentNullException.ThrowIfNull(flowNode.Guid);
return NodeModels.Remove(flowNode.Guid);
}
///
/// 移除画布模型
///
///
///
public bool RemoveCanvasModel(FlowCanvasDetails flowCanvasDetails)
{
ArgumentNullException.ThrowIfNull(flowCanvasDetails.Guid);
return FlowCanvass.Remove(flowCanvasDetails.Guid);
}
///
/// 获取所有节点模型
///
///
public List GetAllNodeModel() => [.. NodeModels.Values];
///
/// 获取指定画布上的所有节点模型
///
///
///
public List GetAllNodeModel(string canvasGuid) =>
NodeModels.Values.Where(x => x.CanvasDetails.Guid == canvasGuid).ToList();
///
/// 获取所有画布模型
///
///
public List GetAllCanvasModel() => [.. FlowCanvass.Values];
///
/// 检查是否存在画布模型
///
///
public bool IsExsitCanvas()
{
return FlowCanvass.Count > 0;
}
///
/// 检查指定画布上是否存在节点模型
///
///
///
public bool IsExsitNodeOnCanvas(string canvasGuid)
{
if (!FlowCanvass.TryGetValue(canvasGuid, out var flowCanvasDetails))
{
return false;
}
return flowCanvasDetails.Nodes.Count > 0;
}
}
}
/* ///
/// 生成方法名称
///
///
///
///
private string GetNodeMethodName(IFlowNode flowNode)
{
return $"FlowMethod_{flowNode.Guid.Remove('-')}";
if (flowNode.ControlType == NodeControlType.Action)
{
if (!flowLibraryService.TryGetMethodInfo(flowNode.MethodDetails.AssemblyName,
flowNode.MethodDetails.MethodName,
out var methodInfo))
{
throw new Exception();
}
return $"FlowMethod_{nameof(NodeControlType.Action)}_{methodInfo.Name}";
}
else if (flowNode.ControlType == NodeControlType.Flipflop)
{
if (!flowLibraryService.TryGetMethodInfo(flowNode.MethodDetails.AssemblyName,
flowNode.MethodDetails.MethodName,
out var methodInfo))
{
throw new Exception();
}
return $"FlowMethod_{nameof(NodeControlType.Flipflop)}_{methodInfo.Name}";
}
else if (flowNode.ControlType == NodeControlType.Script)
{
return $"FlowMethod_{flowNode.Guid.Remove('-')}";
}
else if (flowNode.ControlType == NodeControlType.UI)
{
}
else if (flowNode.ControlType == NodeControlType.ExpCondition)
{
}
else if (flowNode.ControlType == NodeControlType.ExpOp)
{
}
else
{
throw new Exception("无法为该节点生成方法名称");
}
}*/