/**
 * Throws if an object is missing any property in the chain.
 * @param {Object} obj
 * @param {...string} chain
 */
export function ensurePropertyExists(obj, ...chain) {
	for (const prop of chain) {
		if (obj.hasOwnProperty(prop)) {
			obj = obj[prop];
		}
		else {
			throw "Missing property '" + prop + "' in chain [obj]." + chain.join(".");
		}
	}
}

/**
 * Returns true if an object has every property in the chain.
 * Otherwise, returns false and triggers a debug-only error message.
 * @param {Object} obj
 * @param {...string} chain
 * @returns {boolean}
 */
export function checkPropertyExists(obj, ...chain) {
	try {
		ensurePropertyExists(obj, ...chain);
		return true;
	} catch (err) {
		crashDebug(err);
		return false;
	}
}

/**
 * Reports an error to the console, and also shows an error message if in debug mode.
 */
export function crashDebug(message) {
	console.error(message);
	debugger;
	
	if ("$TD" in window) {
		window.$TD.crashDebug(message);
	}
}

/**
 * No-op function.
 */
export function noop() {}