1import software.amazon.awssdk.annotations.SdkInternalApi;
2
3/**
4 * A reference to a field.
5 */
6@SdkInternalApi
7public class Ref extends Expr {
8    private final Identifier name;
9
10    public Ref(Identifier name) {
11        this.name = name;
12    }
13
14    @Override
15    public <R> R accept(ExprVisitor<R> visitor) {
16        return visitor.visitRef(this);
17    }
18
19    public Identifier getName() {
20        return name;
21    }
22
23    @Override
24    public boolean equals(Object o) {
25        if (this == o) {
26            return true;
27        }
28        if (o == null || getClass() != o.getClass()) {
29            return false;
30        }
31        Ref ref = (Ref) o;
32        return name.equals(ref.name);
33    }
34
35    @Override
36    public String template() {
37        return String.format("{%s}", name);
38    }
39
40    @Override
41    public String toString() {
42        return name.asString();
43    }
44
45    @Override
46    public int hashCode() {
47        return name != null ? name.hashCode() : 0;
48    }
49
50    @Override
51    public Value eval(Scope<Value> scope) {
52        return scope.getValue(this.name).orElse(new Value.None());
53    }
54}