001/*
002 * SPDX-FileCopyrightText: none
003 * SPDX-License-Identifier: CC0-1.0
004 */
005
006package dev.metaschema.databind.model;
007
008import dev.metaschema.core.model.JsonGroupAsBehavior;
009import dev.metaschema.core.model.XmlGroupAsBehavior;
010import dev.metaschema.core.qname.IEnhancedQName;
011import edu.umd.cs.findbugs.annotations.NonNull;
012import edu.umd.cs.findbugs.annotations.Nullable;
013
014/**
015 * A data object to record the group as selections.
016 */
017public interface IGroupAs {
018  /**
019   * A singleton instance representing a group-as for non-grouped (singleton)
020   * items.
021   */
022  @NonNull
023  IGroupAs SINGLETON_GROUP_AS = new IGroupAs() {
024    @Override
025    public IEnhancedQName getGroupAsQName() {
026      return null;
027    }
028
029    @Override
030    public JsonGroupAsBehavior getJsonGroupAsBehavior() {
031      return JsonGroupAsBehavior.NONE;
032    }
033
034    @Override
035    public XmlGroupAsBehavior getXmlGroupAsBehavior() {
036      return XmlGroupAsBehavior.UNGROUPED;
037    }
038  };
039
040  /**
041   * Get the qualified name for the group-as, which is used for JSON/YAML key
042   * naming.
043   *
044   * @return the qualified name, or {@code null} if this is a singleton group-as
045   */
046  @Nullable
047  IEnhancedQName getGroupAsQName();
048
049  /**
050   * Get the JSON group-as behavior that determines how grouped items are
051   * serialized in JSON/YAML formats.
052   *
053   * @return the JSON group-as behavior
054   */
055  @NonNull
056  JsonGroupAsBehavior getJsonGroupAsBehavior();
057
058  /**
059   * Get the XML group-as behavior that determines how grouped items are
060   * serialized in XML format.
061   *
062   * @return the XML group-as behavior
063   */
064  @NonNull
065  XmlGroupAsBehavior getXmlGroupAsBehavior();
066}