java/src/main/java/com/konfigthis/newscatcherapi/client/model/SearchUserInput.java
/*
 * NewsCatcher News API V2
 * NewsCatcher is a data-as-a-service startup that has one main goal: to build the largest database of structured news articles published online. In other words, we're like Google for the news part of the web, which you can access as a source of data.  Some useful links: - [How NewsCatcher Works](https://docs.newscatcherapi.com/knowledge-base/how-newscatcher-works) - [GitHub for the Python SDK](https://github.com/NewscatcherAPI/newscatcherapi-sdk-python) 
 *
 * The version of the OpenAPI document: 1.0.1
 * Contact: ychag@example.com
 *
 * NOTE: This class is auto generated by Konfig (https://konfigthis.com).
 * Do not edit the class manually.
 */


package com.konfigthis.newscatcherapi.client.model;

import java.util.Objects;
import java.util.Arrays;
import com.google.gson.TypeAdapter;
import com.google.gson.annotations.JsonAdapter;
import com.google.gson.annotations.SerializedName;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonWriter;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.openapitools.jackson.nullable.JsonNullable;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonArray;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParseException;
import com.google.gson.TypeAdapterFactory;
import com.google.gson.reflect.TypeToken;

import java.lang.reflect.Type;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

import com.konfigthis.newscatcherapi.client.JSON;

/**
 * SearchUserInput
 */
@javax.annotation.Generated(value = "Generated by https://konfigthis.com")
public class SearchUserInput {
  public static final String SERIALIZED_NAME_Q = "q";
  @SerializedName(SERIALIZED_NAME_Q)
  private String q;

  public static final String SERIALIZED_NAME_SEARCH_IN = "search_in";
  @SerializedName(SERIALIZED_NAME_SEARCH_IN)
  private List<String> searchIn = null;

  public static final String SERIALIZED_NAME_LANG = "lang";
  @SerializedName(SERIALIZED_NAME_LANG)
  private List<String> lang = null;

  public static final String SERIALIZED_NAME_NOT_LANG = "not_lang";
  @SerializedName(SERIALIZED_NAME_NOT_LANG)
  private List<String> notLang = null;

  public static final String SERIALIZED_NAME_COUNTRIES = "countries";
  @SerializedName(SERIALIZED_NAME_COUNTRIES)
  private List<String> countries = null;

  public static final String SERIALIZED_NAME_NOT_COUNTRIES = "not_countries";
  @SerializedName(SERIALIZED_NAME_NOT_COUNTRIES)
  private List<String> notCountries = null;

  public static final String SERIALIZED_NAME_FROM = "from";
  @SerializedName(SERIALIZED_NAME_FROM)
  private String from;

  public static final String SERIALIZED_NAME_TO = "to";
  @SerializedName(SERIALIZED_NAME_TO)
  private String to;

  public static final String SERIALIZED_NAME_RANKED_ONLY = "ranked_only";
  @SerializedName(SERIALIZED_NAME_RANKED_ONLY)
  private String rankedOnly;

  public static final String SERIALIZED_NAME_FROM_RANK = "from_rank";
  @SerializedName(SERIALIZED_NAME_FROM_RANK)
  private Integer fromRank;

  public static final String SERIALIZED_NAME_TO_RANK = "to_rank";
  @SerializedName(SERIALIZED_NAME_TO_RANK)
  private Integer toRank;

  public static final String SERIALIZED_NAME_SORT_BY = "sort_by";
  @SerializedName(SERIALIZED_NAME_SORT_BY)
  private String sortBy;

  public static final String SERIALIZED_NAME_PAGE = "page";
  @SerializedName(SERIALIZED_NAME_PAGE)
  private Integer page;

  public static final String SERIALIZED_NAME_SIZE = "size";
  @SerializedName(SERIALIZED_NAME_SIZE)
  private Integer size;

  public static final String SERIALIZED_NAME_SOURCES = "sources";
  @SerializedName(SERIALIZED_NAME_SOURCES)
  private List<String> sources = null;

  public static final String SERIALIZED_NAME_NOT_SOURCES = "not_sources";
  @SerializedName(SERIALIZED_NAME_NOT_SOURCES)
  private List<String> notSources = null;

  public static final String SERIALIZED_NAME_TOPIC = "topic";
  @SerializedName(SERIALIZED_NAME_TOPIC)
  private String topic;

  public static final String SERIALIZED_NAME_PUBLISHED_DATE_PRECISION = "published_date_precision";
  @SerializedName(SERIALIZED_NAME_PUBLISHED_DATE_PRECISION)
  private String publishedDatePrecision;

  public SearchUserInput() {
  }

  public SearchUserInput q(String q) {
    
    this.q = q;
    return this;
  }

   /**
   * Get q
   * @return q
  **/
  @javax.annotation.Nullable
  @ApiModelProperty(value = "")

  public String getQ() {
    return q;
  }


  public void setQ(String q) {
    this.q = q;
  }


  public SearchUserInput searchIn(List<String> searchIn) {
    
    this.searchIn = searchIn;
    return this;
  }

  public SearchUserInput addSearchInItem(String searchInItem) {
    if (this.searchIn == null) {
      this.searchIn = new ArrayList<>();
    }
    this.searchIn.add(searchInItem);
    return this;
  }

   /**
   * Get searchIn
   * @return searchIn
  **/
  @javax.annotation.Nullable
  @ApiModelProperty(value = "")

  public List<String> getSearchIn() {
    return searchIn;
  }


  public void setSearchIn(List<String> searchIn) {
    this.searchIn = searchIn;
  }


  public SearchUserInput lang(List<String> lang) {
    
    this.lang = lang;
    return this;
  }

  public SearchUserInput addLangItem(String langItem) {
    if (this.lang == null) {
      this.lang = new ArrayList<>();
    }
    this.lang.add(langItem);
    return this;
  }

   /**
   * Get lang
   * @return lang
  **/
  @javax.annotation.Nullable
  @ApiModelProperty(value = "")

  public List<String> getLang() {
    return lang;
  }


  public void setLang(List<String> lang) {
    this.lang = lang;
  }


  public SearchUserInput notLang(List<String> notLang) {
    
    this.notLang = notLang;
    return this;
  }

  public SearchUserInput addNotLangItem(String notLangItem) {
    if (this.notLang == null) {
      this.notLang = new ArrayList<>();
    }
    this.notLang.add(notLangItem);
    return this;
  }

   /**
   * Get notLang
   * @return notLang
  **/
  @javax.annotation.Nullable
  @ApiModelProperty(value = "")

  public List<String> getNotLang() {
    return notLang;
  }


  public void setNotLang(List<String> notLang) {
    this.notLang = notLang;
  }


  public SearchUserInput countries(List<String> countries) {
    
    this.countries = countries;
    return this;
  }

  public SearchUserInput addCountriesItem(String countriesItem) {
    if (this.countries == null) {
      this.countries = new ArrayList<>();
    }
    this.countries.add(countriesItem);
    return this;
  }

   /**
   * Get countries
   * @return countries
  **/
  @javax.annotation.Nullable
  @ApiModelProperty(value = "")

  public List<String> getCountries() {
    return countries;
  }


  public void setCountries(List<String> countries) {
    this.countries = countries;
  }


  public SearchUserInput notCountries(List<String> notCountries) {
    
    this.notCountries = notCountries;
    return this;
  }

  public SearchUserInput addNotCountriesItem(String notCountriesItem) {
    if (this.notCountries == null) {
      this.notCountries = new ArrayList<>();
    }
    this.notCountries.add(notCountriesItem);
    return this;
  }

   /**
   * Get notCountries
   * @return notCountries
  **/
  @javax.annotation.Nullable
  @ApiModelProperty(value = "")

  public List<String> getNotCountries() {
    return notCountries;
  }


  public void setNotCountries(List<String> notCountries) {
    this.notCountries = notCountries;
  }


  public SearchUserInput from(String from) {
    
    this.from = from;
    return this;
  }

   /**
   * Get from
   * @return from
  **/
  @javax.annotation.Nullable
  @ApiModelProperty(value = "")

  public String getFrom() {
    return from;
  }


  public void setFrom(String from) {
    this.from = from;
  }


  public SearchUserInput to(String to) {
    
    this.to = to;
    return this;
  }

   /**
   * Get to
   * @return to
  **/
  @javax.annotation.Nullable
  @ApiModelProperty(value = "")

  public String getTo() {
    return to;
  }


  public void setTo(String to) {
    this.to = to;
  }


  public SearchUserInput rankedOnly(String rankedOnly) {
    
    this.rankedOnly = rankedOnly;
    return this;
  }

   /**
   * Get rankedOnly
   * @return rankedOnly
  **/
  @javax.annotation.Nullable
  @ApiModelProperty(value = "")

  public String getRankedOnly() {
    return rankedOnly;
  }


  public void setRankedOnly(String rankedOnly) {
    this.rankedOnly = rankedOnly;
  }


  public SearchUserInput fromRank(Integer fromRank) {
    
    this.fromRank = fromRank;
    return this;
  }

   /**
   * Get fromRank
   * @return fromRank
  **/
  @javax.annotation.Nullable
  @ApiModelProperty(value = "")

  public Integer getFromRank() {
    return fromRank;
  }


  public void setFromRank(Integer fromRank) {
    this.fromRank = fromRank;
  }


  public SearchUserInput toRank(Integer toRank) {
    
    this.toRank = toRank;
    return this;
  }

   /**
   * Get toRank
   * @return toRank
  **/
  @javax.annotation.Nullable
  @ApiModelProperty(value = "")

  public Integer getToRank() {
    return toRank;
  }


  public void setToRank(Integer toRank) {
    this.toRank = toRank;
  }


  public SearchUserInput sortBy(String sortBy) {
    
    this.sortBy = sortBy;
    return this;
  }

   /**
   * Get sortBy
   * @return sortBy
  **/
  @javax.annotation.Nullable
  @ApiModelProperty(value = "")

  public String getSortBy() {
    return sortBy;
  }


  public void setSortBy(String sortBy) {
    this.sortBy = sortBy;
  }


  public SearchUserInput page(Integer page) {
    
    this.page = page;
    return this;
  }

   /**
   * Get page
   * @return page
  **/
  @javax.annotation.Nullable
  @ApiModelProperty(value = "")

  public Integer getPage() {
    return page;
  }


  public void setPage(Integer page) {
    this.page = page;
  }


  public SearchUserInput size(Integer size) {
    
    this.size = size;
    return this;
  }

   /**
   * Get size
   * @return size
  **/
  @javax.annotation.Nullable
  @ApiModelProperty(value = "")

  public Integer getSize() {
    return size;
  }


  public void setSize(Integer size) {
    this.size = size;
  }


  public SearchUserInput sources(List<String> sources) {
    
    this.sources = sources;
    return this;
  }

  public SearchUserInput addSourcesItem(String sourcesItem) {
    if (this.sources == null) {
      this.sources = new ArrayList<>();
    }
    this.sources.add(sourcesItem);
    return this;
  }

   /**
   * Get sources
   * @return sources
  **/
  @javax.annotation.Nullable
  @ApiModelProperty(value = "")

  public List<String> getSources() {
    return sources;
  }


  public void setSources(List<String> sources) {
    this.sources = sources;
  }


  public SearchUserInput notSources(List<String> notSources) {
    
    this.notSources = notSources;
    return this;
  }

  public SearchUserInput addNotSourcesItem(String notSourcesItem) {
    if (this.notSources == null) {
      this.notSources = new ArrayList<>();
    }
    this.notSources.add(notSourcesItem);
    return this;
  }

   /**
   * Get notSources
   * @return notSources
  **/
  @javax.annotation.Nullable
  @ApiModelProperty(value = "")

  public List<String> getNotSources() {
    return notSources;
  }


  public void setNotSources(List<String> notSources) {
    this.notSources = notSources;
  }


  public SearchUserInput topic(String topic) {
    
    this.topic = topic;
    return this;
  }

   /**
   * Get topic
   * @return topic
  **/
  @javax.annotation.Nullable
  @ApiModelProperty(value = "")

  public String getTopic() {
    return topic;
  }


  public void setTopic(String topic) {
    this.topic = topic;
  }


  public SearchUserInput publishedDatePrecision(String publishedDatePrecision) {
    
    this.publishedDatePrecision = publishedDatePrecision;
    return this;
  }

   /**
   * Get publishedDatePrecision
   * @return publishedDatePrecision
  **/
  @javax.annotation.Nullable
  @ApiModelProperty(value = "")

  public String getPublishedDatePrecision() {
    return publishedDatePrecision;
  }


  public void setPublishedDatePrecision(String publishedDatePrecision) {
    this.publishedDatePrecision = publishedDatePrecision;
  }

  /**
   * A container for additional, undeclared properties.
   * This is a holder for any undeclared properties as specified with
   * the 'additionalProperties' keyword in the OAS document.
   */
  private Map<String, Object> additionalProperties;

  /**
   * Set the additional (undeclared) property with the specified name and value.
   * If the property does not already exist, create it otherwise replace it.
   *
   * @param key name of the property
   * @param value value of the property
   * @return the SearchUserInput instance itself
   */
  public SearchUserInput putAdditionalProperty(String key, Object value) {
    if (this.additionalProperties == null) {
        this.additionalProperties = new HashMap<String, Object>();
    }
    this.additionalProperties.put(key, value);
    return this;
  }

  /**
   * Return the additional (undeclared) property.
   *
   * @return a map of objects
   */
  public Map<String, Object> getAdditionalProperties() {
    return additionalProperties;
  }

  /**
   * Return the additional (undeclared) property with the specified name.
   *
   * @param key name of the property
   * @return an object
   */
  public Object getAdditionalProperty(String key) {
    if (this.additionalProperties == null) {
        return null;
    }
    return this.additionalProperties.get(key);
  }


  @Override
  public boolean equals(Object o) {
    if (this == o) {
      return true;
    }
    if (o == null || getClass() != o.getClass()) {
      return false;
    }
    SearchUserInput searchUserInput = (SearchUserInput) o;
    return Objects.equals(this.q, searchUserInput.q) &&
        Objects.equals(this.searchIn, searchUserInput.searchIn) &&
        Objects.equals(this.lang, searchUserInput.lang) &&
        Objects.equals(this.notLang, searchUserInput.notLang) &&
        Objects.equals(this.countries, searchUserInput.countries) &&
        Objects.equals(this.notCountries, searchUserInput.notCountries) &&
        Objects.equals(this.from, searchUserInput.from) &&
        Objects.equals(this.to, searchUserInput.to) &&
        Objects.equals(this.rankedOnly, searchUserInput.rankedOnly) &&
        Objects.equals(this.fromRank, searchUserInput.fromRank) &&
        Objects.equals(this.toRank, searchUserInput.toRank) &&
        Objects.equals(this.sortBy, searchUserInput.sortBy) &&
        Objects.equals(this.page, searchUserInput.page) &&
        Objects.equals(this.size, searchUserInput.size) &&
        Objects.equals(this.sources, searchUserInput.sources) &&
        Objects.equals(this.notSources, searchUserInput.notSources) &&
        Objects.equals(this.topic, searchUserInput.topic) &&
        Objects.equals(this.publishedDatePrecision, searchUserInput.publishedDatePrecision)&&
        Objects.equals(this.additionalProperties, searchUserInput.additionalProperties);
  }

  private static <T> boolean equalsNullable(JsonNullable<T> a, JsonNullable<T> b) {
    return a == b || (a != null && b != null && a.isPresent() && b.isPresent() && Objects.deepEquals(a.get(), b.get()));
  }

  @Override
  public int hashCode() {
    return Objects.hash(q, searchIn, lang, notLang, countries, notCountries, from, to, rankedOnly, fromRank, toRank, sortBy, page, size, sources, notSources, topic, publishedDatePrecision, additionalProperties);
  }

  private static <T> int hashCodeNullable(JsonNullable<T> a) {
    if (a == null) {
      return 1;
    }
    return a.isPresent() ? Arrays.deepHashCode(new Object[]{a.get()}) : 31;
  }

  @Override
  public String toString() {
    StringBuilder sb = new StringBuilder();
    sb.append("class SearchUserInput {\n");
    sb.append("    q: ").append(toIndentedString(q)).append("\n");
    sb.append("    searchIn: ").append(toIndentedString(searchIn)).append("\n");
    sb.append("    lang: ").append(toIndentedString(lang)).append("\n");
    sb.append("    notLang: ").append(toIndentedString(notLang)).append("\n");
    sb.append("    countries: ").append(toIndentedString(countries)).append("\n");
    sb.append("    notCountries: ").append(toIndentedString(notCountries)).append("\n");
    sb.append("    from: ").append(toIndentedString(from)).append("\n");
    sb.append("    to: ").append(toIndentedString(to)).append("\n");
    sb.append("    rankedOnly: ").append(toIndentedString(rankedOnly)).append("\n");
    sb.append("    fromRank: ").append(toIndentedString(fromRank)).append("\n");
    sb.append("    toRank: ").append(toIndentedString(toRank)).append("\n");
    sb.append("    sortBy: ").append(toIndentedString(sortBy)).append("\n");
    sb.append("    page: ").append(toIndentedString(page)).append("\n");
    sb.append("    size: ").append(toIndentedString(size)).append("\n");
    sb.append("    sources: ").append(toIndentedString(sources)).append("\n");
    sb.append("    notSources: ").append(toIndentedString(notSources)).append("\n");
    sb.append("    topic: ").append(toIndentedString(topic)).append("\n");
    sb.append("    publishedDatePrecision: ").append(toIndentedString(publishedDatePrecision)).append("\n");
    sb.append("    additionalProperties: ").append(toIndentedString(additionalProperties)).append("\n");
    sb.append("}");
    return sb.toString();
  }

  /**
   * Convert the given object to string with each line indented by 4 spaces
   * (except the first line).
   */
  private String toIndentedString(Object o) {
    if (o == null) {
      return "null";
    }
    return o.toString().replace("\n", "\n    ");
  }


  public static HashSet<String> openapiFields;
  public static HashSet<String> openapiRequiredFields;

  static {
    // a set of all properties/fields (JSON key names)
    openapiFields = new HashSet<String>();
    openapiFields.add("q");
    openapiFields.add("search_in");
    openapiFields.add("lang");
    openapiFields.add("not_lang");
    openapiFields.add("countries");
    openapiFields.add("not_countries");
    openapiFields.add("from");
    openapiFields.add("to");
    openapiFields.add("ranked_only");
    openapiFields.add("from_rank");
    openapiFields.add("to_rank");
    openapiFields.add("sort_by");
    openapiFields.add("page");
    openapiFields.add("size");
    openapiFields.add("sources");
    openapiFields.add("not_sources");
    openapiFields.add("topic");
    openapiFields.add("published_date_precision");

    // a set of required properties/fields (JSON key names)
    openapiRequiredFields = new HashSet<String>();
  }

 /**
  * Validates the JSON Object and throws an exception if issues found
  *
  * @param jsonObj JSON Object
  * @throws IOException if the JSON Object is invalid with respect to SearchUserInput
  */
  public static void validateJsonObject(JsonObject jsonObj) throws IOException {
      if (jsonObj == null) {
        if (!SearchUserInput.openapiRequiredFields.isEmpty()) { // has required fields but JSON object is null
          throw new IllegalArgumentException(String.format("The required field(s) %s in SearchUserInput is not found in the empty JSON string", SearchUserInput.openapiRequiredFields.toString()));
        }
      }
      if ((jsonObj.get("q") != null && !jsonObj.get("q").isJsonNull()) && !jsonObj.get("q").isJsonPrimitive()) {
        throw new IllegalArgumentException(String.format("Expected the field `q` to be a primitive type in the JSON string but got `%s`", jsonObj.get("q").toString()));
      }
      // ensure the optional json data is an array if present (nullable)
      if (jsonObj.get("search_in") != null && !jsonObj.get("search_in").isJsonNull() && !jsonObj.get("search_in").isJsonArray()) {
        throw new IllegalArgumentException(String.format("Expected the field `search_in` to be an array in the JSON string or null but got `%s`", jsonObj.get("search_in").toString()));
      }
      // ensure the optional json data is an array if present (nullable)
      if (jsonObj.get("lang") != null && !jsonObj.get("lang").isJsonNull() && !jsonObj.get("lang").isJsonArray()) {
        throw new IllegalArgumentException(String.format("Expected the field `lang` to be an array in the JSON string or null but got `%s`", jsonObj.get("lang").toString()));
      }
      // ensure the optional json data is an array if present (nullable)
      if (jsonObj.get("not_lang") != null && !jsonObj.get("not_lang").isJsonNull() && !jsonObj.get("not_lang").isJsonArray()) {
        throw new IllegalArgumentException(String.format("Expected the field `not_lang` to be an array in the JSON string or null but got `%s`", jsonObj.get("not_lang").toString()));
      }
      // ensure the optional json data is an array if present (nullable)
      if (jsonObj.get("countries") != null && !jsonObj.get("countries").isJsonNull() && !jsonObj.get("countries").isJsonArray()) {
        throw new IllegalArgumentException(String.format("Expected the field `countries` to be an array in the JSON string or null but got `%s`", jsonObj.get("countries").toString()));
      }
      // ensure the optional json data is an array if present (nullable)
      if (jsonObj.get("not_countries") != null && !jsonObj.get("not_countries").isJsonNull() && !jsonObj.get("not_countries").isJsonArray()) {
        throw new IllegalArgumentException(String.format("Expected the field `not_countries` to be an array in the JSON string or null but got `%s`", jsonObj.get("not_countries").toString()));
      }
      if ((jsonObj.get("from") != null && !jsonObj.get("from").isJsonNull()) && !jsonObj.get("from").isJsonPrimitive()) {
        throw new IllegalArgumentException(String.format("Expected the field `from` to be a primitive type in the JSON string but got `%s`", jsonObj.get("from").toString()));
      }
      if (!jsonObj.get("to").isJsonNull() && (jsonObj.get("to") != null && !jsonObj.get("to").isJsonNull()) && !jsonObj.get("to").isJsonPrimitive()) {
        throw new IllegalArgumentException(String.format("Expected the field `to` to be a primitive type in the JSON string but got `%s`", jsonObj.get("to").toString()));
      }
      if ((jsonObj.get("ranked_only") != null && !jsonObj.get("ranked_only").isJsonNull()) && !jsonObj.get("ranked_only").isJsonPrimitive()) {
        throw new IllegalArgumentException(String.format("Expected the field `ranked_only` to be a primitive type in the JSON string but got `%s`", jsonObj.get("ranked_only").toString()));
      }
      if ((jsonObj.get("sort_by") != null && !jsonObj.get("sort_by").isJsonNull()) && !jsonObj.get("sort_by").isJsonPrimitive()) {
        throw new IllegalArgumentException(String.format("Expected the field `sort_by` to be a primitive type in the JSON string but got `%s`", jsonObj.get("sort_by").toString()));
      }
      // ensure the optional json data is an array if present (nullable)
      if (jsonObj.get("sources") != null && !jsonObj.get("sources").isJsonNull() && !jsonObj.get("sources").isJsonArray()) {
        throw new IllegalArgumentException(String.format("Expected the field `sources` to be an array in the JSON string or null but got `%s`", jsonObj.get("sources").toString()));
      }
      // ensure the optional json data is an array if present (nullable)
      if (jsonObj.get("not_sources") != null && !jsonObj.get("not_sources").isJsonNull() && !jsonObj.get("not_sources").isJsonArray()) {
        throw new IllegalArgumentException(String.format("Expected the field `not_sources` to be an array in the JSON string or null but got `%s`", jsonObj.get("not_sources").toString()));
      }
      if (!jsonObj.get("topic").isJsonNull() && (jsonObj.get("topic") != null && !jsonObj.get("topic").isJsonNull()) && !jsonObj.get("topic").isJsonPrimitive()) {
        throw new IllegalArgumentException(String.format("Expected the field `topic` to be a primitive type in the JSON string but got `%s`", jsonObj.get("topic").toString()));
      }
      if (!jsonObj.get("published_date_precision").isJsonNull() && (jsonObj.get("published_date_precision") != null && !jsonObj.get("published_date_precision").isJsonNull()) && !jsonObj.get("published_date_precision").isJsonPrimitive()) {
        throw new IllegalArgumentException(String.format("Expected the field `published_date_precision` to be a primitive type in the JSON string but got `%s`", jsonObj.get("published_date_precision").toString()));
      }
  }

  public static class CustomTypeAdapterFactory implements TypeAdapterFactory {
    @SuppressWarnings("unchecked")
    @Override
    public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) {
       if (!SearchUserInput.class.isAssignableFrom(type.getRawType())) {
         return null; // this class only serializes 'SearchUserInput' and its subtypes
       }
       final TypeAdapter<JsonElement> elementAdapter = gson.getAdapter(JsonElement.class);
       final TypeAdapter<SearchUserInput> thisAdapter
                        = gson.getDelegateAdapter(this, TypeToken.get(SearchUserInput.class));

       return (TypeAdapter<T>) new TypeAdapter<SearchUserInput>() {
           @Override
           public void write(JsonWriter out, SearchUserInput value) throws IOException {
             JsonObject obj = thisAdapter.toJsonTree(value).getAsJsonObject();
             obj.remove("additionalProperties");
             // serialize additonal properties
             if (value.getAdditionalProperties() != null) {
               for (Map.Entry<String, Object> entry : value.getAdditionalProperties().entrySet()) {
                 if (entry.getValue() instanceof String)
                   obj.addProperty(entry.getKey(), (String) entry.getValue());
                 else if (entry.getValue() instanceof Number)
                   obj.addProperty(entry.getKey(), (Number) entry.getValue());
                 else if (entry.getValue() instanceof Boolean)
                   obj.addProperty(entry.getKey(), (Boolean) entry.getValue());
                 else if (entry.getValue() instanceof Character)
                   obj.addProperty(entry.getKey(), (Character) entry.getValue());
                 else {
                   obj.add(entry.getKey(), gson.toJsonTree(entry.getValue()).getAsJsonObject());
                 }
               }
             }
             elementAdapter.write(out, obj);
           }

           @Override
           public SearchUserInput read(JsonReader in) throws IOException {
             JsonObject jsonObj = elementAdapter.read(in).getAsJsonObject();
             validateJsonObject(jsonObj);
             // store additional fields in the deserialized instance
             SearchUserInput instance = thisAdapter.fromJsonTree(jsonObj);
             for (Map.Entry<String, JsonElement> entry : jsonObj.entrySet()) {
               if (!openapiFields.contains(entry.getKey())) {
                 if (entry.getValue().isJsonPrimitive()) { // primitive type
                   if (entry.getValue().getAsJsonPrimitive().isString())
                     instance.putAdditionalProperty(entry.getKey(), entry.getValue().getAsString());
                   else if (entry.getValue().getAsJsonPrimitive().isNumber())
                     instance.putAdditionalProperty(entry.getKey(), entry.getValue().getAsNumber());
                   else if (entry.getValue().getAsJsonPrimitive().isBoolean())
                     instance.putAdditionalProperty(entry.getKey(), entry.getValue().getAsBoolean());
                   else
                     throw new IllegalArgumentException(String.format("The field `%s` has unknown primitive type. Value: %s", entry.getKey(), entry.getValue().toString()));
                 } else if (entry.getValue().isJsonArray()) {
                     instance.putAdditionalProperty(entry.getKey(), gson.fromJson(entry.getValue(), List.class));
                 } else { // JSON object
                     instance.putAdditionalProperty(entry.getKey(), gson.fromJson(entry.getValue(), HashMap.class));
                 }
               }
             }
             return instance;
           }

       }.nullSafe();
    }
  }

 /**
  * Create an instance of SearchUserInput given an JSON string
  *
  * @param jsonString JSON string
  * @return An instance of SearchUserInput
  * @throws IOException if the JSON string is invalid with respect to SearchUserInput
  */
  public static SearchUserInput fromJson(String jsonString) throws IOException {
    return JSON.getGson().fromJson(jsonString, SearchUserInput.class);
  }

 /**
  * Convert an instance of SearchUserInput to an JSON string
  *
  * @return JSON string
  */
  public String toJson() {
    return JSON.getGson().toJson(this);
  }
}

