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

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

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

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

#define _DESCRIPTOR_ "issue12403"


#define _GO_issue12403_Parsable_DESCRIPTOR_ "go.issue12403.Parsable"
#define _GO_issue12403_Parsable_FromJSON_ (0x10a)
#define _GO_issue12403_Parsable_ToJSON_ (0x20a)

@interface GoIssue12403Parsable : NSObject <GoIssue12403Parsable> {
}
@property(strong, readonly) id _ref;

- (id)initWithRef:(id)ref;
- (NSString*)fromJSON:(NSString*)jstr;
- (BOOL)toJSON:(NSString**)ret0_ error:(NSError**)error;
@end

@implementation GoIssue12403Parsable {
}

- (id)initWithRef:(id)ref {
	self = [super init];
	if (self) { __ref = ref; }
	return self;
}

- (NSString*)fromJSON:(NSString*)jstr {
	GoSeq in_ = {};
	GoSeq out_ = {};
	go_seq_writeRef(&in_, self._ref);
	go_seq_writeUTF8(&in_, jstr);
	go_seq_send(_GO_issue12403_Parsable_DESCRIPTOR_, _GO_issue12403_Parsable_FromJSON_, &in_, &out_);
	NSString* ret0_ = go_seq_readUTF8(&out_);
	go_seq_free(&in_);
	go_seq_free(&out_);
	return ret0_;
}

- (BOOL)toJSON:(NSString**)ret0_ error:(NSError**)error {
	GoSeq in_ = {};
	GoSeq out_ = {};
	go_seq_writeRef(&in_, self._ref);
	go_seq_send(_GO_issue12403_Parsable_DESCRIPTOR_, _GO_issue12403_Parsable_ToJSON_, &in_, &out_);
	NSString* ret0__val = go_seq_readUTF8(&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);
}

@end

static void proxyGoIssue12403Parsable(id obj, int code, GoSeq* in, GoSeq* out) {
	switch (code) {
	case _GO_issue12403_Parsable_FromJSON_: {
		id<GoIssue12403Parsable> o = (id<GoIssue12403Parsable>)(obj);
		NSString* jstr = go_seq_readUTF8(in);
		NSString* returnVal = [o fromJSON:jstr];
		go_seq_writeUTF8(out, returnVal);
	} break;
	case _GO_issue12403_Parsable_ToJSON_: {
		id<GoIssue12403Parsable> o = (id<GoIssue12403Parsable>)(obj);
		NSString* ret0_;
		NSError* error = NULL;
		BOOL returnVal = [o toJSON:&ret0_ error:&error];
		go_seq_writeUTF8(out, ret0_);
		if (returnVal) {
			go_seq_writeUTF8(out, NULL);
		} else {
			NSString* errorDesc = [error localizedDescription];
			if (errorDesc == NULL || errorDesc.length == 0) {
				errorDesc = @"gobind: unknown error";
			}
			go_seq_writeUTF8(out, errorDesc);
		}
	} break;
	default:
		NSLog(@"unknown code %x for _GO_issue12403_Parsable_DESCRIPTOR_", code);
	}
}

__attribute__((constructor)) static void init() {
	go_seq_register_proxy("go.issue12403.Parsable", proxyGoIssue12403Parsable);
}
