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.IBoundObject;
009import dev.metaschema.core.model.INamedModelInstanceGrouped;
010import dev.metaschema.core.model.JsonGroupAsBehavior;
011import dev.metaschema.core.model.util.ModuleUtils;
012import dev.metaschema.core.util.ObjectUtils;
013import dev.metaschema.databind.io.BindingException;
014import dev.metaschema.databind.model.info.IFeatureComplexItemValueHandler;
015import edu.umd.cs.findbugs.annotations.Nullable;
016
017/**
018 * Represents a model instance that is a member of a choice group instance.
019 */
020public interface IBoundInstanceModelGroupedNamed
021    extends INamedModelInstanceGrouped, IFeatureComplexItemValueHandler {
022  @Override
023  IBoundInstanceModelChoiceGroup getParentContainer();
024
025  @Override
026  IBoundDefinitionModelComplex getDefinition();
027
028  @Override
029  @Nullable
030  default IBoundInstanceFlag getEffectiveJsonKey() {
031    return JsonGroupAsBehavior.KEYED.equals(getParentContainer().getJsonGroupAsBehavior())
032        ? getJsonKey()
033        : null;
034  }
035
036  @Override
037  default IBoundInstanceFlag getJsonKey() {
038    String name = getParentContainer().getJsonKeyFlagInstanceName();
039    return name == null
040        ? null
041        : ObjectUtils.requireNonNull(
042            getDefinition().getFlagInstanceByName(
043                ModuleUtils.parseFlagName(getContainingModule(), name).getIndexPosition()));
044  }
045
046  @Override
047  default IBoundDefinitionModelAssembly getContainingDefinition() {
048    return getParentContainer().getContainingDefinition();
049  }
050
051  @Override
052  default String getName() {
053    return getDefinition().getName();
054  }
055
056  @Override
057  default IBoundObject deepCopyItem(IBoundObject item, IBoundObject parentInstance) throws BindingException {
058    return getDefinition().deepCopyItem(item, parentInstance);
059  }
060
061  @Override
062  default void callBeforeDeserialize(IBoundObject targetObject, IBoundObject parentObject) throws BindingException {
063    getDefinition().callBeforeDeserialize(targetObject, parentObject);
064  }
065
066  @Override
067  default void callAfterDeserialize(IBoundObject targetObject, IBoundObject parentObject) throws BindingException {
068    getDefinition().callAfterDeserialize(targetObject, parentObject);
069  }
070}