001/*
002 * SPDX-FileCopyrightText: none
003 * SPDX-License-Identifier: CC0-1.0
004 */
005
006package dev.metaschema.databind.model;
007
008import java.io.IOException;
009
010import dev.metaschema.core.model.IBoundObject;
011import dev.metaschema.core.model.IContainerFlagSupport;
012import dev.metaschema.core.model.IFeatureDefinitionInstanceInlined;
013import dev.metaschema.core.model.IModelElementVisitor;
014import dev.metaschema.core.util.ObjectUtils;
015import dev.metaschema.databind.model.info.IFeatureScalarItemValueHandler;
016import dev.metaschema.databind.model.info.IItemReadHandler;
017import dev.metaschema.databind.model.info.IItemWriteHandler;
018
019/**
020 * Represents a bound field instance that contains scalar (simple) data, such as
021 * a string or number value.
022 */
023public interface IBoundInstanceModelFieldScalar
024    extends IBoundInstanceModelField<Object>,
025    IBoundDefinitionModelField<Object>, IFeatureScalarItemValueHandler,
026    IFeatureDefinitionInstanceInlined<IBoundDefinitionModelField<Object>, IBoundInstanceModelFieldScalar> {
027
028  // integrate above
029  @Override
030  default IBoundDefinitionModelField<Object> getDefinition() {
031    return IFeatureDefinitionInstanceInlined.super.getDefinition();
032  }
033
034  @Override
035  default boolean isInline() {
036    return IFeatureDefinitionInstanceInlined.super.isInline();
037  }
038
039  @Override
040  default IBoundInstanceModelFieldScalar getInlineInstance() {
041    return IFeatureDefinitionInstanceInlined.super.getInlineInstance();
042  }
043
044  @Override
045  IBoundDefinitionModelAssembly getContainingDefinition();
046
047  @Override
048  default IContainerFlagSupport<IBoundInstanceFlag> getFlagContainer() {
049    return IContainerFlagSupport.empty();
050  }
051
052  @Override
053  default IBoundInstanceFlag getJsonKey() {
054    // no flags
055    return null;
056  }
057
058  @Override
059  default IBoundInstanceFlag getItemJsonKey(Object item) {
060    // no flags, no JSON key
061    return null;
062  }
063
064  @Override
065  default Object getFieldValue(Object item) {
066    // the item is the field value
067    return item;
068  }
069
070  @Override
071  default String getJsonValueKeyName() {
072    // no bound value, no value key name
073    return null;
074  }
075
076  @Override
077  default IBoundInstanceFlag getJsonValueKeyFlagInstance() {
078    // no bound value, no value key name
079    return null;
080  }
081
082  @Override
083  default Object readItem(IBoundObject parent, IItemReadHandler handler) throws IOException {
084    return handler.readItemField(ObjectUtils.requireNonNull(parent, "parent"), this);
085  }
086
087  @Override
088  default void writeItem(Object item, IItemWriteHandler handler) throws IOException {
089    handler.writeItemField(item, this);
090  }
091
092  @Override
093  default <CONTEXT, RESULT> RESULT accept(IModelElementVisitor<CONTEXT, RESULT> visitor, CONTEXT context) {
094    return IBoundInstanceModelField.super.accept(visitor, context);
095  }
096}