The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
MODULE = Git::Raw			PACKAGE = Git::Raw::Config

Config
new(class)
	SV *class

	PREINIT:
		int rc;
		Config cfg;

	CODE:
		rc = git_config_new(&cfg);
		git_check_error(rc);

		RETVAL = cfg;

	OUTPUT: RETVAL

void
add_file(self, path, level)
	Config self
	SV *path
	int level

	PREINIT:
		int rc;

	CODE:
		rc = git_config_add_file_ondisk(
			self, git_ensure_pv(path, "path"), level, 0
		);
		git_check_error(rc);

SV *
bool(self, name, ...)
	Config self
	SV *name

	PROTOTYPE: $$;$

	PREINIT:
		int rc, value;

		const char *id = NULL;

	CODE:
		id = git_ensure_pv(name, "name");

		if (items == 3) {
			value = git_ensure_iv(ST(2), "value");

			rc = git_config_set_bool(self, id, value);
		} else {
			if ((rc = git_config_get_bool(&value, self, id)) == GIT_ENOTFOUND)
				XSRETURN_UNDEF;
		}

		git_check_error(rc);
		RETVAL = newSViv(value);

	OUTPUT: RETVAL

SV *
int(self, name, ...)
	Config self
	SV *name

	PROTOTYPE: $$;$

	PREINIT:
		int rc, value;

		const char *id = NULL;

	CODE:
		id = git_ensure_pv(name, "name");

		if (items == 3) {
			value = git_ensure_iv(ST(2), "value");

			rc = git_config_set_int32(self, id, value);
		} else {
			if ((rc = git_config_get_int32(&value, self, id)) == GIT_ENOTFOUND)
				XSRETURN_UNDEF;
		}

		git_check_error(rc);
		RETVAL = newSViv(value);

	OUTPUT: RETVAL

SV *
str(self, name, ...)
	Config self
	SV *name

	PROTOTYPE: $$;$

	PREINIT:
		int rc;
		const char *value;

		const char *id = NULL;
	CODE:
		id = git_ensure_pv(name, "name");

		if (items == 3) {
			value = git_ensure_pv(ST(2), "value");

			rc = git_config_set_string(self, id, value);
			git_check_error(rc);

			RETVAL = newSVpv(value, 0);
		} else {
			git_buf buf = GIT_BUF_INIT_CONST(NULL, 0);
			if ((rc = git_config_get_string_buf(&buf, self, id)) == GIT_ENOTFOUND)
				XSRETURN_UNDEF;
			git_check_error(rc);

			RETVAL = newSVpv(buf.ptr, 0);
			git_buf_free(&buf);
		}

	OUTPUT: RETVAL

void
foreach(self, cb)
	Config self
	SV *cb

	PREINIT:
		int rc;

		git_foreach_payload payload = { NULL, NULL, NULL };

	CODE:
		payload.cb = cb;

		rc = git_config_foreach(
			self, git_config_foreach_cbb, &payload
		);

		if (rc != GIT_EUSER)
			git_check_error(rc);

Config
default(class)
	SV *class

	PREINIT:
		int rc;
		Config cfg;

	CODE:
		rc = git_config_open_default(&cfg);
		git_check_error(rc);

		RETVAL = cfg;

	OUTPUT: RETVAL

void
delete(self, name)
	Config self
	SV *name

	PREINIT:
		int rc;

	CODE:
		rc = git_config_delete_entry(self, git_ensure_pv(name, "name"));
		git_check_error(rc);

void
DESTROY(self)
	Config self

	CODE:
		git_config_free(self);