Code/Expressions/VariableExpression.cs
using System;
using System.Collections.Generic;

namespace Expressive.Expressions
{
    internal class VariableExpression : IExpression
    {
        private readonly string variableName;

        internal VariableExpression(string variableName)
        {
            this.variableName = variableName;
        }

        #region IExpression Members

        /// <inheritdoc />
        public object Evaluate(IDictionary<string, object> variables)
        {
            if (variables is null ||
                !variables.TryGetValue(this.variableName, out var variableValue))
            {
                throw new ArgumentException("The variable '" + this.variableName + "' has not been supplied.");
            }

            // Check to see if we have to referred to another expression.
            if (variableValue is IExpression expression)
            {
                return expression.Evaluate(variables);
            }

            return variableValue;
        }

        #endregion
    }
}