/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to you 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. 
 */
#ifndef AVRO_ENCODING_H
#define AVRO_ENCODING_H
#ifdef __cplusplus
extern "C" {
#define CLOSE_EXTERN }
#else
#define CLOSE_EXTERN
#endif

#include <avro/platform.h>
#include "avro/io.h"

/*
 * TODO: this will need more functions when JSON encoding is added 
 */
struct avro_encoding_t {
	const char *description;
	/*
	 * string 
	 */
	int (*read_string) (avro_reader_t reader, char **s, int64_t *len);
	int (*skip_string) (avro_reader_t reader);
	int (*write_string) (avro_writer_t writer, const char *s);
	 int64_t(*size_string) (avro_writer_t writer, const char *s);
	/*
	 * bytes 
	 */
	int (*read_bytes) (avro_reader_t reader, char **bytes, int64_t * len);
	int (*skip_bytes) (avro_reader_t reader);
	int (*write_bytes) (avro_writer_t writer,
			    const char *bytes, const int64_t len);
	 int64_t(*size_bytes) (avro_writer_t writer,
			       const char *bytes, const int64_t len);
	/*
	 * int 
	 */
	int (*read_int) (avro_reader_t reader, int32_t * i);
	int (*skip_int) (avro_reader_t reader);
	int (*write_int) (avro_writer_t writer, const int32_t i);
	 int64_t(*size_int) (avro_writer_t writer, const int32_t i);
	/*
	 * long 
	 */
	int (*read_long) (avro_reader_t reader, int64_t * l);
	int (*skip_long) (avro_reader_t reader);
	int (*write_long) (avro_writer_t writer, const int64_t l);
	 int64_t(*size_long) (avro_writer_t writer, const int64_t l);
	/*
	 * float 
	 */
	int (*read_float) (avro_reader_t reader, float *f);
	int (*skip_float) (avro_reader_t reader);
	int (*write_float) (avro_writer_t writer, const float f);
	 int64_t(*size_float) (avro_writer_t writer, const float f);
	/*
	 * double 
	 */
	int (*read_double) (avro_reader_t reader, double *d);
	int (*skip_double) (avro_reader_t reader);
	int (*write_double) (avro_writer_t writer, const double d);
	 int64_t(*size_double) (avro_writer_t writer, const double d);
	/*
	 * boolean 
	 */
	int (*read_boolean) (avro_reader_t reader, int8_t * b);
	int (*skip_boolean) (avro_reader_t reader);
	int (*write_boolean) (avro_writer_t writer, const int8_t b);
	 int64_t(*size_boolean) (avro_writer_t writer, const int8_t b);
	/*
	 * null 
	 */
	int (*read_null) (avro_reader_t reader);
	int (*skip_null) (avro_reader_t reader);
	int (*write_null) (avro_writer_t writer);
	 int64_t(*size_null) (avro_writer_t writer);
};
typedef struct avro_encoding_t avro_encoding_t;

#define AVRO_WRITE(writer, buf, len) \
{ int rval = avro_write( writer, buf, len ); if(rval) return rval; }
#define AVRO_READ(reader, buf, len)  \
{ int rval = avro_read( reader, buf, len ); if(rval) return rval; }
#define AVRO_SKIP(reader, len) \
{ int rval = avro_skip( reader, len); if (rval) return rval; }

extern const avro_encoding_t avro_binary_encoding;	/* in
							 * encoding_binary 
							 */
CLOSE_EXTERN
#endif
