/*
  Copyright (c) 2014 DataStax

  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at

  http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
*/

#include "types.hpp"

extern "C" {

const char* cass_error_desc(CassError error) {
  switch (error) {
#define XX(source, _, code, desc) \
  case CASS_ERROR(source, code):  \
    return desc;
    CASS_ERROR_MAP(XX)
#undef XX
    default:
      return "";
  }
}

const char* cass_log_level_string(CassLogLevel log_level) {
  switch (log_level) {
#define XX(log_level, desc) \
  case log_level:           \
    return desc;
    CASS_LOG_LEVEL_MAP(XX)
#undef XX
    default:
      return "";
  }
}

CassInet cass_inet_init_v4(const cass_uint8_t* address) {
  CassInet inet;
  inet.address_length = CASS_INET_V4_LENGTH;
  memcpy(inet.address, address, CASS_INET_V4_LENGTH);
  return inet;
}

CassInet cass_inet_init_v6(const cass_uint8_t* address) {
  CassInet inet;
  inet.address_length = CASS_INET_V6_LENGTH;
  memcpy(inet.address, address, CASS_INET_V6_LENGTH);
  return inet;
}

CassDecimal cass_decimal_init(cass_int32_t scale, CassBytes varint) {
  CassDecimal decimal;
  decimal.scale = scale;
  decimal.varint = varint;
  return decimal;
}

CassString cass_string_init(const char* null_terminated) {
  CassString str;
  str.data = null_terminated;
  str.length = strlen(null_terminated);
  return str;
}

CassString cass_string_init2(const char* data, cass_size_t length) {
  CassString str;
  str.data = data;
  str.length = length;
  return str;
}

CassBytes cass_bytes_init(const cass_byte_t* data, cass_size_t size) {
  CassBytes bytes;
  bytes.data = data;
  bytes.size = size;
  return bytes;
}

} // extern "C"
