using System; using System.Collections.Generic; using UnityEngine; namespace UnityEditor.ShaderGraph.Serialization { [Serializable] struct JsonData : ISerializationCallbackReceiver where T : JsonObject { [NonSerialized] T m_Value; [SerializeField] string m_Id; public T value => m_Value; public void OnBeforeSerialize() { if (MultiJsonInternal.isSerializing && m_Value != null && MultiJsonInternal.serializedSet.Add(m_Id)) { MultiJsonInternal.serializationQueue.Add(m_Value); } } public void OnAfterDeserialize() { if (MultiJsonInternal.isDeserializing) { try { if (MultiJsonInternal.valueMap.TryGetValue(m_Id, out var value)) { m_Value = value.CastTo(); // cast may fail for unknown types, but we can still grab the id from the original UnknownType m_Id = value.objectId; } else { Debug.LogError($"Missing {typeof(T).FullName} {m_Id}"); } } catch (Exception e) { // TODO: Allow custom logging function Debug.LogException(e); } } } public static implicit operator T(JsonData jsonRef) { return jsonRef.m_Value; } public static implicit operator JsonData(T value) { return new JsonData { m_Value = value, m_Id = value.objectId }; } public bool Equals(JsonData other) { return EqualityComparer.Default.Equals(m_Value, other.m_Value); } public bool Equals(T other) { return EqualityComparer.Default.Equals(m_Value, other); } public override bool Equals(object obj) { return obj is JsonData other && Equals(other) || obj is T otherValue && Equals(otherValue); } public override int GetHashCode() { return EqualityComparer.Default.GetHashCode(m_Value); } public static bool operator ==(JsonData left, JsonData right) { return left.value == right.value; } public static bool operator !=(JsonData left, JsonData right) { return left.value != right.value; } public static bool operator ==(JsonData left, T right) { return left.value == right; } public static bool operator !=(JsonData left, T right) { return left.value != right; } public static bool operator ==(T left, JsonData right) { return left == right.value; } public static bool operator !=(T left, JsonData right) { return left != right.value; } public static bool operator ==(JsonData left, JsonRef right) { return left.value == right.value; } public static bool operator !=(JsonData left, JsonRef right) { return left.value != right.value; } public static bool operator ==(JsonRef left, JsonData right) { return left.value == right.value; } public static bool operator !=(JsonRef left, JsonData right) { return left.value != right.value; } } }