| using System.Collections.Generic; |
| using System.Linq; |
| using OfficeOpenXml.FormulaParsing.Excel.Functions; |
| using OfficeOpenXml.FormulaParsing.Exceptions; |
| using OfficeOpenXml.FormulaParsing.Utilities; |
| |
| namespace OfficeOpenXml.FormulaParsing.ExpressionGraph.FunctionCompilers; |
| |
| public class IfErrorFunctionCompiler : FunctionCompiler { |
| public IfErrorFunctionCompiler(ExcelFunction function) |
| : base(function) { |
| Require.That(function).Named("function").IsNotNull(); |
| } |
| |
| public override CompileResult Compile(IEnumerable<Expression> children, ParsingContext context) { |
| if (children.Count() != 2) { |
| throw new ExcelErrorValueException(eErrorType.Value); |
| } |
| var args = new List<FunctionArgument>(); |
| Function.BeforeInvoke(context); |
| var firstChild = children.First(); |
| var lastChild = children.ElementAt(1); |
| try { |
| var result = firstChild.Compile(); |
| if (result.DataType == DataType.ExcelError) { |
| args.Add(new(lastChild.Compile().Result)); |
| } else { |
| args.Add(new(result.Result)); |
| } |
| } catch (ExcelErrorValueException) { |
| args.Add(new(lastChild.Compile().Result)); |
| } |
| return Function.Execute(args, context); |
| } |
| } |