// ========================================================================== // Squidex Headless CMS // ========================================================================== // Copyright (c) Squidex UG (haftungsbeschraenkt) // All rights reserved. Licensed under the MIT license. // ========================================================================== using System.Diagnostics.Contracts; using System.Text.Json.Serialization; namespace Squidex.Domain.Apps.Core.Schemas; public sealed record ArrayField : RootField, IArrayField { [JsonIgnore] public IReadOnlyList Fields { get => FieldCollection.Ordered; } [JsonIgnore] public IReadOnlyDictionary FieldsById { get => FieldCollection.ById; } [JsonIgnore] public IReadOnlyDictionary FieldsByName { get => FieldCollection.ByName; } public FieldCollection FieldCollection { get; init; } = FieldCollection.Empty; [Pure] public ArrayField DeleteField(long fieldId) { return Updatefields(f => f.Remove(fieldId)); } [Pure] public ArrayField ReorderFields(List ids) { return Updatefields(f => f.Reorder(ids)); } [Pure] public ArrayField AddField(NestedField field) { return Updatefields(f => f.Add(field)); } [Pure] public ArrayField UpdateField(long fieldId, Func updater) { return Updatefields(f => f.Update(fieldId, updater)); } private ArrayField Updatefields(Func, FieldCollection> updater) { var newFields = updater(FieldCollection); if (ReferenceEquals(newFields, FieldCollection)) { return this; } return this with { FieldCollection = newFields }; } }