Status AddValueToFeature()

in tensorflow_serving/util/json_tensor.cc [680:737]


Status AddValueToFeature(const rapidjson::Value& val,
                         const string& feature_name, Feature* feature) {
  switch (val.GetType()) {
    case rapidjson::kNullType:
      return errors::InvalidArgument(
          "Feature: ", feature_name,
          " has element with unexpected JSON type: ", JsonTypeString(val));
    case rapidjson::kFalseType:
    case rapidjson::kTrueType:
      if (!IsFeatureOfKind(*feature, Feature::KindCase::kInt64List)) {
        return IncompatibleFeatureKindError(feature_name, *feature);
      }
      feature->mutable_int64_list()->add_value(val.GetBool() ? 1 : 0);
      break;
    case rapidjson::kObjectType:
      if (!IsValBase64Object(val)) {
        return errors::InvalidArgument(
            "Feature: ", feature_name,
            " has element with unexpected JSON type: ", JsonTypeString(val));
      }
      if (!IsFeatureOfKind(*feature, Feature::KindCase::kBytesList)) {
        return IncompatibleFeatureKindError(feature_name, *feature);
      }
      TF_RETURN_IF_ERROR(JsonDecodeBase64Object(
          val, feature->mutable_bytes_list()->add_value()));
      break;
    case rapidjson::kArrayType:
      return errors::InvalidArgument(
          "Feature: ", feature_name,
          " has element with unexpected JSON type: ", JsonTypeString(val));
    case rapidjson::kStringType:
      if (!IsFeatureOfKind(*feature, Feature::KindCase::kBytesList)) {
        return IncompatibleFeatureKindError(feature_name, *feature);
      }
      feature->mutable_bytes_list()->add_value(val.GetString(),
                                               val.GetStringLength());
      break;
    case rapidjson::kNumberType:
      if (val.IsDouble()) {
        if (!IsFeatureOfKind(*feature, Feature::KindCase::kFloatList)) {
          return IncompatibleFeatureKindError(feature_name, *feature);
        }
        feature->mutable_float_list()->add_value(val.GetFloat());
      } else {
        if (!IsFeatureOfKind(*feature, Feature::KindCase::kInt64List)) {
          return IncompatibleFeatureKindError(feature_name, *feature);
        }
        if (!val.IsInt64() && val.IsUint64()) {
          return errors::InvalidArgument(
              "Feature: ", feature_name,
              " has uint64_t element. Only int64_t is supported.");
        }
        feature->mutable_int64_list()->add_value(val.GetInt64());
      }
      break;
  }
  return Status::OK();
}