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

@class GoIssue12403Parsable;

@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

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

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