// Objective-C API for talking to basictypes Go package.
//   gobind -lang=objc basictypes
//
// File is generated by gobind. Do not edit.

#include "GoBasictypes.h"
#include <Foundation/Foundation.h>
#include "seq.h"

static NSString* errDomain = @"go.basictypes";

@protocol goSeqRefInterface
-(GoSeqRef*) _ref;
@end

#define _DESCRIPTOR_ "basictypes"

const BOOL GoBasictypesABool = YES;
const double GoBasictypesAFloat = 0.2015;
const int32_t GoBasictypesARune = 32;
NSString* const GoBasictypesAString = @"a string";
const int64_t GoBasictypesAnInt = 7LL;
const int64_t GoBasictypesAnInt2 = 9223372036854775807LL;

#define _CALL_Bool_ 1
#define _CALL_ByteArrays_ 2
#define _CALL_Error_ 3
#define _CALL_ErrorPair_ 4
#define _CALL_Ints_ 5

BOOL GoBasictypesBool(BOOL p0) {
	GoSeq in_ = {};
	GoSeq out_ = {};
	go_seq_writeBool(&in_, p0);
	go_seq_send(_DESCRIPTOR_, _CALL_Bool_, &in_, &out_);
	BOOL ret0_ = go_seq_readBool(&out_);
	go_seq_free(&in_);
	go_seq_free(&out_);
	return ret0_;
}

NSData* GoBasictypesByteArrays(NSData* x) {
	GoSeq in_ = {};
	GoSeq out_ = {};
	go_seq_writeByteArray(&in_, x);
	go_seq_send(_DESCRIPTOR_, _CALL_ByteArrays_, &in_, &out_);
	NSData* ret0_ = go_seq_readByteArray(&out_);
	go_seq_free(&in_);
	go_seq_free(&out_);
	return ret0_;
}

BOOL GoBasictypesError(NSError** error) {
	GoSeq in_ = {};
	GoSeq out_ = {};
	go_seq_send(_DESCRIPTOR_, _CALL_Error_, &in_, &out_);
	NSString* _error = go_seq_readUTF8(&out_);
	if ([_error length] != 0 && error != nil) {
		NSMutableDictionary* details = [NSMutableDictionary dictionary];
		[details setValue:_error forKey:NSLocalizedDescriptionKey];
		*error = [NSError errorWithDomain:errDomain code:1 userInfo:details];
	}
	go_seq_free(&in_);
	go_seq_free(&out_);
	return ([_error length] == 0);
}

BOOL GoBasictypesErrorPair(int* ret0_, NSError** error) {
	GoSeq in_ = {};
	GoSeq out_ = {};
	go_seq_send(_DESCRIPTOR_, _CALL_ErrorPair_, &in_, &out_);
	int ret0__val = go_seq_readInt(&out_);
	if (ret0_ != NULL) {
		*ret0_ = ret0__val;
	}
	NSString* _error = go_seq_readUTF8(&out_);
	if ([_error length] != 0 && error != nil) {
		NSMutableDictionary* details = [NSMutableDictionary dictionary];
		[details setValue:_error forKey:NSLocalizedDescriptionKey];
		*error = [NSError errorWithDomain:errDomain code:1 userInfo:details];
	}
	go_seq_free(&in_);
	go_seq_free(&out_);
	return ([_error length] == 0);
}

void GoBasictypesInts(int8_t x, int16_t y, int32_t z, int64_t t, int u) {
	GoSeq in_ = {};
	GoSeq out_ = {};
	go_seq_writeInt8(&in_, x);
	go_seq_writeInt16(&in_, y);
	go_seq_writeInt32(&in_, z);
	go_seq_writeInt64(&in_, t);
	go_seq_writeInt(&in_, u);
	go_seq_send(_DESCRIPTOR_, _CALL_Ints_, &in_, &out_);
	go_seq_free(&in_);
	go_seq_free(&out_);
}

