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

#include <Foundation/Foundation.h>
#include "seq.h"
#include "_cgo_export.h"
#include "Issue12403.objc.h"

@implementation Issue12403Parsable {
}

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

- (NSString*)fromJSON:(NSString*)jstr {
	int32_t refnum = go_seq_go_to_refnum(self._ref);
	nstring _jstr = go_seq_from_objc_string(jstr);
	nstring r0 = proxyissue12403_Parsable_FromJSON(refnum, _jstr);
	NSString *_ret0_ = go_seq_to_objc_string(r0);
	return _ret0_;
}

- (NSString*)toJSON:(NSError**)error {
	int32_t refnum = go_seq_go_to_refnum(self._ref);
	struct proxyissue12403_Parsable_ToJSON_return res = proxyissue12403_Parsable_ToJSON(refnum);
	NSString *_ret0_ = go_seq_to_objc_string(res.r0);
	Universeerror* _error = nil;
	GoSeqRef* _error_ref = go_seq_from_refnum(res.r1);
	if (_error_ref != NULL) {
		_error = _error_ref.obj;
		if (_error == nil) {
			_error = [[Universeerror alloc] initWithRef:_error_ref];
		}
	}
	if (_error != nil && error != nil) {
		*error = _error;
	}
	if (_error != nil) {
		return nil;
	}
	return _ret0_;
}

@end



nstring cproxyissue12403_Parsable_FromJSON(int32_t refnum, nstring jstr) {
	@autoreleasepool {
		Issue12403Parsable* o = go_seq_objc_from_refnum(refnum);
		NSString *_jstr = go_seq_to_objc_string(jstr);
		NSString* ret0_;
		ret0_ = [o fromJSON:_jstr];
		nstring _ret0_ = go_seq_from_objc_string(ret0_);
		return _ret0_;
	}
}

struct cproxyissue12403_Parsable_ToJSON_return cproxyissue12403_Parsable_ToJSON(int32_t refnum) {
	@autoreleasepool {
		Issue12403Parsable* o = go_seq_objc_from_refnum(refnum);
		NSString* ret0_;
		NSError* error = nil;
		ret0_ = [o toJSON:&error];
		nstring _ret0_ = go_seq_from_objc_string(ret0_);
		NSError *_error = nil;
		if (error != nil) {
			_error = error;
		}
		int32_t __error;
		if ([_error conformsToProtocol:@protocol(goSeqRefInterface)]) {
			id<goSeqRefInterface> _error_proxy = (id<goSeqRefInterface>)(_error);
			__error = go_seq_go_to_refnum(_error_proxy._ref);
		} else {
			__error = go_seq_to_refnum(_error);
		}
		cproxyissue12403_Parsable_ToJSON_return _sres = {
		  _ret0_, __error
		};
		return _sres;
	}
}

__attribute__((constructor)) static void init() {
	init_seq();
}
