using System; using UnityEngine.Assertions; using UnityEngine.UIElements; namespace RosettaUI.UIToolkit.Builder { public interface IBuildBindFunc { VisualElement Build(Element element); bool Bind(Element element, VisualElement visualElement); } public class BuildBindFunc : IBuildBindFunc where TVisualElement : VisualElement, new() { private readonly Func _buildFunc; private readonly Func _bindFunc; public static BuildBindFunc Create(Func bindFunc) => new(null, bindFunc); public BuildBindFunc(Func buildFunc, Func bindFunc) { (_buildFunc, _bindFunc) = (buildFunc, bindFunc); } public VisualElement Build(Element element) => _buildFunc != null ? _buildFunc(element) : BuildDefault(element); public bool Bind(Element element, VisualElement visualElement) => _bindFunc(element, visualElement); private VisualElement BuildDefault(Element element) { var ve = new TVisualElement(); var success = Bind(element, ve); Assert.IsTrue(success, $"Bind failed. VisualElement type[{typeof(TVisualElement)} Element type [{element.GetType()}]"); return ve; } } }