namespace DIT.Workflower.DependencyInjection; public sealed class WorkflowDefinitionWrapper : IWorkflow where TState : struct where TCommand : struct { private readonly IServiceProvider _serviceProvider; private readonly WorkflowDefinition> _definition; public string Id { get; } public int Version { get; } public List>> GetAllTransitionDefinitions() { return _definition.GetAllTransitionDefinitions(); } public List> GetAllowedTransitions(TState from) { return _definition.GetAllowedTransitions(from); } public List> GetAllowedTransitions(TContext context, TState from) { return _definition.GetAllowedTransitions(GetContextWrapper(context), from); } public IEnumerable> GetAllowedTransitions(ListTransitionsRequest request) { var wrappedRequest = new ListTransitionsRequest> { From = request.From, To = request.To, Command = request.Command, Context = request.Context is null ? null : GetContextWrapper(request.Context) }; return _definition.GetAllowedTransitions(wrappedRequest); } public WorkflowDefinitionWrapper(WorkflowDefinitionBuilder> builder, IServiceProvider serviceProvider, string id, int version) { _definition = builder.Build(); _serviceProvider = serviceProvider; Id = id; Version = version; } private ContextWrapper GetContextWrapper(in TContext context) => new(context, _serviceProvider); public static string GetDefaultId() { var ctxType = typeof(TContext); var ctxName = ctxType.Name; if (ctxType.IsGenericType) ctxName = string.Join("+", typeof(TContext).GetGenericArguments().Select(x => x.Name)); return $"{typeof(TState).Name}_{typeof(TCommand).Name}_{ctxName}"; } }