public static Either<string, bool> HasStateTypeOf(Type stateType, Type[] stateTypeInterfaces) { if (stateType == null) throw new ArgumentNullException(nameof(stateType)); var stateTypeInfo = stateType.GetTypeInfo(); var res = stateTypeInterfaces == null || stateTypeInterfaces.Length == 0 ? Left<string, bool>("No public interfaces") : Right<string, bool>(stateTypeInterfaces.Filter(notnull).Map(t => t.GetTypeInfo()).Fold(false, (value, type) => value ? true : type.IsAssignableFrom(stateTypeInfo))); if(res.IsRight && res.Lift()) { return res; } else { return Left<string, bool>("State-type (" + stateType.FullName + ") doesn't match inbox declared interfaces: " + String.Join(", ", stateTypeInterfaces.Map(x => x.FullName))); } }
public static Either<string, bool> IsMessageValidForProcess(Type messageType, Type[] inboxDeclaredType) { if (messageType == null) { return Left<string, bool>("Message invalid (null)"); } var messageTypeInfo = messageType.GetTypeInfo(); if (typeof(TerminatedMessage).GetTypeInfo().IsAssignableFrom(messageTypeInfo) || typeof(UserControlMessage).GetTypeInfo().IsAssignableFrom(messageTypeInfo) || typeof(SystemMessage).GetTypeInfo().IsAssignableFrom(messageTypeInfo) || typeof(RelayMsg).GetTypeInfo().IsAssignableFrom(messageTypeInfo)) { return Right<string, bool>(true); } return inboxDeclaredType == null || inboxDeclaredType.Length == 0 ? Left<string, bool>("No declared types") : Right<string, bool>(inboxDeclaredType.Filter(notnull).Map(t => t.GetTypeInfo()).Fold(false, (value, type) => value ? true : type.IsAssignableFrom(messageTypeInfo))); }