public SetVariableResult SetValue(IVariableStore variables, VariableValue value) { var left = Left.Evaluate(variables); var right = Right.Evaluate(variables); var result = VariableHandler.Apply(ref left, right, value); if (result == SetVariableResult.Success && !left.HasReference) { if (Left is IAssignableOperation assignable) { return(assignable.SetValue(variables, value)); } else { throw new ExpressionEvaluationException(_invalidAssignException, value, right, Left); } } switch (result) { case SetVariableResult.NotFound: throw new ExpressionEvaluationException(_missingAssignmentException, value, right, left); case SetVariableResult.ReadOnly: throw new ExpressionEvaluationException(_readOnlyAssignmentException, value, right, left); case SetVariableResult.TypeMismatch: throw new ExpressionEvaluationException(_mismatchedAssignmentException, value, value.Type, right, left); } return(result); }
public SetVariableResult SetValue(ref VariableValue owner, VariableValue value) { var result = VariableHandler.Apply(ref owner, VariableValue.Create(Name), value); switch (result) { case SetVariableResult.NotFound: throw new ExpressionEvaluationException(_missingAssignmentException, value, Name, owner); case SetVariableResult.ReadOnly: throw new ExpressionEvaluationException(_readOnlyAssignmentException, value, Name, owner); case SetVariableResult.TypeMismatch: throw new ExpressionEvaluationException(_mismatchedAssignmentException, value, value.Type, Name, owner); } return(result); }
private SetVariableResult SetValue_(ref VariableValue owner, VariableValue value, int index) { var token = _tokens[index]; if (index == _tokens.Count - 1) { switch (token.Type) { case VariableTokenType.Name: { return(VariableHandler.Apply(ref owner, VariableValue.Create(token.Text), value)); } case VariableTokenType.Number: { if (int.TryParse(token.Text, out var number)) { return(VariableHandler.Apply(ref owner, VariableValue.Create(number), value)); } break; } case VariableTokenType.Type: { return(SetVariableResult.ReadOnly); } } } else { var lookup = VariableValue.Empty; var child = VariableValue.Empty; switch (token.Type) { case VariableTokenType.Name: { lookup = VariableValue.Create(token.Text); child = VariableHandler.Lookup(owner, lookup); break; } case VariableTokenType.Number: { if (int.TryParse(token.Text, out var number)) { lookup = VariableValue.Create(number); child = VariableHandler.Lookup(owner, lookup); } break; } case VariableTokenType.Type: { child = VariableHandler.Cast(owner, token.Text); break; } } if (!child.IsEmpty) { // if a value is set on a struct (Vector3.x for instance), the variable value needs to be // reassigned to its owner var result = SetValue_(ref child, value, index + 1); if (result == SetVariableResult.Success && !child.HasReference) { result = VariableHandler.Apply(ref owner, lookup, child); } return(result); } } return(SetVariableResult.NotFound); }