A game about forced loneliness, made by TACStudios
1using System;
2using System.Collections;
3using System.Collections.Generic;
4
5namespace Unity.VisualScripting
6{
7 [SerializationVersion("A")]
8 public sealed class VariableDeclarations : IEnumerable<VariableDeclaration>, ISpecifiesCloner
9 {
10 public VariableDeclarations()
11 {
12 collection = new VariableDeclarationCollection();
13 }
14
15 public VariableKind Kind;
16
17 [Serialize, InspectorWide(true)]
18 private VariableDeclarationCollection collection;
19
20 internal Action OnVariableChanged;
21
22 public object this[[InspectorVariableName(ActionDirection.Any)] string variable]
23 {
24 get => Get(variable);
25 set => Set(variable, value);
26 }
27
28 public void Set([InspectorVariableName(ActionDirection.Set)] string variable, object value)
29 {
30 if (string.IsNullOrEmpty(variable))
31 {
32 // Do nothing: safer for e.g. default event configurations,
33 // where we don't specify a variable name. If we specified a default,
34 // we might override a user value inadvertently.
35 return;
36 }
37
38 if (collection.TryGetValue(variable, out var declaration))
39 {
40 if (declaration.value != value)
41 {
42 declaration.value = value;
43 OnVariableChanged?.Invoke();
44 }
45 }
46 else
47 {
48 collection.Add(new VariableDeclaration(variable, value));
49 OnVariableChanged?.Invoke();
50 }
51 }
52
53 public object Get([InspectorVariableName(ActionDirection.Get)] string variable)
54 {
55 if (string.IsNullOrEmpty(variable))
56 {
57 throw new ArgumentException("No variable name specified.", nameof(variable));
58 }
59
60 if (collection.TryGetValue(variable, out var declaration))
61 {
62 return declaration.value;
63 }
64
65 throw new InvalidOperationException($"Variable not found: '{variable}'.");
66 }
67
68 public T Get<T>([InspectorVariableName(ActionDirection.Get)] string variable)
69 {
70 return (T)Get(variable, typeof(T));
71 }
72
73 public object Get([InspectorVariableName(ActionDirection.Get)] string variable, Type expectedType)
74 {
75 return ConversionUtility.Convert(Get(variable), expectedType);
76 }
77
78 public void Clear()
79 {
80 collection.Clear();
81 }
82
83 public bool IsDefined([InspectorVariableName(ActionDirection.Any)] string variable)
84 {
85 if (string.IsNullOrEmpty(variable))
86 {
87 throw new ArgumentException("No variable name specified.", nameof(variable));
88 }
89
90 return collection.Contains(variable);
91 }
92
93 public VariableDeclaration GetDeclaration(string variable)
94 {
95 if (collection.TryGetValue(variable, out var declaration))
96 {
97 return declaration;
98 }
99
100 throw new InvalidOperationException($"Variable not found: '{variable}'.");
101 }
102
103 public IEnumerator<VariableDeclaration> GetEnumerator()
104 {
105 return collection.GetEnumerator();
106 }
107
108 IEnumerator IEnumerable.GetEnumerator()
109 {
110 return ((IEnumerable)collection).GetEnumerator();
111 }
112
113 ICloner ISpecifiesCloner.cloner => VariableDeclarationsCloner.instance;
114 }
115}