001
002package com.commercetools.api.models.product;
003
004import java.time.*;
005import java.util.*;
006import java.util.function.Function;
007
008import javax.annotation.Nullable;
009import javax.validation.constraints.NotNull;
010
011import com.fasterxml.jackson.annotation.*;
012import com.fasterxml.jackson.databind.annotation.*;
013
014import io.vrap.rmf.base.client.utils.Generated;
015
016/**
017 * FacetResult
018 *
019 * <hr>
020 * Example to create a subtype instance using the builder pattern
021 * <div class=code-example>
022 * <pre><code class='java'>
023 *     FacetResult facetResult = FacetResult.filterBuilder()
024 *             count(0.3)
025 *             .build()
026 * </code></pre>
027 * </div>
028 */
029@JsonSubTypes({
030        @JsonSubTypes.Type(value = com.commercetools.api.models.product.FilteredFacetResultImpl.class, name = FilteredFacetResult.FILTER),
031        @JsonSubTypes.Type(value = com.commercetools.api.models.product.RangeFacetResultImpl.class, name = RangeFacetResult.RANGE),
032        @JsonSubTypes.Type(value = com.commercetools.api.models.product.TermFacetResultImpl.class, name = TermFacetResult.TERMS) })
033@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.EXISTING_PROPERTY, property = "type", defaultImpl = FacetResultImpl.class, visible = true)
034@JsonDeserialize(as = FacetResultImpl.class)
035@Generated(value = "io.vrap.rmf.codegen.rendering.CoreCodeGenerator", comments = "https://github.com/commercetools/rmf-codegen")
036public interface FacetResult {
037
038    /**
039     *
040     * @return type
041     */
042    @NotNull
043    @JsonProperty("type")
044    public FacetTypes getType();
045
046    /**
047     * factory method to create a deep copy of FacetResult
048     * @param template instance to be copied
049     * @return copy instance
050     */
051    @Nullable
052    public static FacetResult deepCopy(@Nullable final FacetResult template) {
053        if (template == null) {
054            return null;
055        }
056        if (template instanceof com.commercetools.api.models.product.FilteredFacetResult) {
057            return com.commercetools.api.models.product.FilteredFacetResult
058                    .deepCopy((com.commercetools.api.models.product.FilteredFacetResult) template);
059        }
060        if (template instanceof com.commercetools.api.models.product.RangeFacetResult) {
061            return com.commercetools.api.models.product.RangeFacetResult
062                    .deepCopy((com.commercetools.api.models.product.RangeFacetResult) template);
063        }
064        if (template instanceof com.commercetools.api.models.product.TermFacetResult) {
065            return com.commercetools.api.models.product.TermFacetResult
066                    .deepCopy((com.commercetools.api.models.product.TermFacetResult) template);
067        }
068        FacetResultImpl instance = new FacetResultImpl();
069        return instance;
070    }
071
072    /**
073     * builder for filter subtype
074     * @return builder
075     */
076    public static com.commercetools.api.models.product.FilteredFacetResultBuilder filterBuilder() {
077        return com.commercetools.api.models.product.FilteredFacetResultBuilder.of();
078    }
079
080    /**
081     * builder for range subtype
082     * @return builder
083     */
084    public static com.commercetools.api.models.product.RangeFacetResultBuilder rangeBuilder() {
085        return com.commercetools.api.models.product.RangeFacetResultBuilder.of();
086    }
087
088    /**
089     * builder for terms subtype
090     * @return builder
091     */
092    public static com.commercetools.api.models.product.TermFacetResultBuilder termsBuilder() {
093        return com.commercetools.api.models.product.TermFacetResultBuilder.of();
094    }
095
096    /**
097     * accessor map function
098     * @param <T> mapped type
099     * @param helper function to map the object
100     * @return mapped value
101     */
102    default <T> T withFacetResult(Function<FacetResult, T> helper) {
103        return helper.apply(this);
104    }
105
106    /**
107     * gives a TypeReference for usage with Jackson DataBind
108     * @return TypeReference
109     */
110    public static com.fasterxml.jackson.core.type.TypeReference<FacetResult> typeReference() {
111        return new com.fasterxml.jackson.core.type.TypeReference<FacetResult>() {
112            @Override
113            public String toString() {
114                return "TypeReference<FacetResult>";
115            }
116        };
117    }
118}