// 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"

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

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;

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_);
}

