diff --git a/src/Tgstation.Server.Host/Models/TransformerBase{TInput,TOutput}.cs b/src/Tgstation.Server.Host/Models/TransformerBase{TInput,TOutput}.cs index 1da0c09d9e..73295f68ef 100644 --- a/src/Tgstation.Server.Host/Models/TransformerBase{TInput,TOutput}.cs +++ b/src/Tgstation.Server.Host/Models/TransformerBase{TInput,TOutput}.cs @@ -123,7 +123,6 @@ namespace Tgstation.Server.Host.Models notNullExpression1, subOutput1Expression, global::System.Linq.Expressions.Expression.Constant(null, typeof(TSubOutput1))); - var conditionalSubOutput2Expression = global::System.Linq.Expressions.Expression.Condition( notNullExpression2, subOutput2Expression, @@ -172,7 +171,54 @@ namespace Tgstation.Server.Host.Models where TTransformer2 : ITransformer, new() where TTransformer3 : ITransformer, new() { - throw new NotImplementedException(); + var subTransformer1 = new TTransformer1(); + var subTransformer2 = new TTransformer2(); + var subTransformer3 = new TTransformer3(); + + var primaryInput = global::System.Linq.Expressions.Expression.Parameter(typeof(TInput), "input"); + + var subInput1Expression = global::System.Linq.Expressions.Expression.Invoke(subInput1SelectionExpression, primaryInput); + var subInput2Expression = global::System.Linq.Expressions.Expression.Invoke(subInput2SelectionExpression, primaryInput); + var subInput3Expression = global::System.Linq.Expressions.Expression.Invoke(subInput3SelectionExpression, primaryInput); + + var notNullExpression1 = global::System.Linq.Expressions.Expression.MakeBinary( + ExpressionType.NotEqual, + subInput1Expression, + global::System.Linq.Expressions.Expression.Constant(null, typeof(TSubInput1))); + var notNullExpression2 = global::System.Linq.Expressions.Expression.MakeBinary( + ExpressionType.NotEqual, + subInput2Expression, + global::System.Linq.Expressions.Expression.Constant(null, typeof(TSubInput2))); + var notNullExpression3 = global::System.Linq.Expressions.Expression.MakeBinary( + ExpressionType.NotEqual, + subInput3Expression, + global::System.Linq.Expressions.Expression.Constant(null, typeof(TSubInput3))); + + var subOutput1Expression = global::System.Linq.Expressions.Expression.Invoke(subTransformer1.Expression, subInput1Expression); + var subOutput2Expression = global::System.Linq.Expressions.Expression.Invoke(subTransformer2.Expression, subInput2Expression); + var subOutput3Expression = global::System.Linq.Expressions.Expression.Invoke(subTransformer3.Expression, subInput3Expression); + + var conditionalSubOutput1Expression = global::System.Linq.Expressions.Expression.Condition( + notNullExpression1, + subOutput1Expression, + global::System.Linq.Expressions.Expression.Constant(null, typeof(TSubOutput1))); + var conditionalSubOutput2Expression = global::System.Linq.Expressions.Expression.Condition( + notNullExpression2, + subOutput2Expression, + global::System.Linq.Expressions.Expression.Constant(null, typeof(TSubOutput2))); + var conditionalSubOutput3Expression = global::System.Linq.Expressions.Expression.Condition( + notNullExpression3, + subOutput3Expression, + global::System.Linq.Expressions.Expression.Constant(null, typeof(TSubOutput3))); + + var outputExpression = global::System.Linq.Expressions.Expression.Invoke( + transformerExpression, + primaryInput, + conditionalSubOutput1Expression, + conditionalSubOutput2Expression, + conditionalSubOutput3Expression); + + return global::System.Linq.Expressions.Expression.Lambda>(outputExpression, primaryInput); } ///