src / helpers / resource_helper.gd

Attached Scenes

Note
No attached scenes.

Code

extends Node
class_name ResourceHelper


static func parse(klass, json_or_props) -> Resource:
	var resource = klass.new()
	var props = JSON.parse_string(json_or_props) \
		if typeof(json_or_props) == TYPE_STRING \
		else json_or_props
	var mapper = klass.parse_mapping() \
		if klass.has_method('parse_mapping') else {}
	for key in props:
		if mapper.has(key):
			for prop in props[key]:
				var child = parse(mapper[key], prop)
				resource.get(key).push_back(child)
		else: resource.set(key, props[key])
	return resource


static func json(resource: Resource) -> String:
	return JSON.stringify(dict(resource))


static func dict(value: Variant) -> Variant:
	match typeof(value):
		TYPE_OBJECT:
			return properties_of(value).reduce(func(h, prop):
				h[prop] = dict(value.get(prop))
				return h, {})
		TYPE_ARRAY:
			return value.map(func(v): return dict(v))
		_: return value


static func properties_of(resource: Resource) -> Array:
	var script = resource.get_script()
	var s_arr = script.get_property_list().map(func(p): return p.name)
	var p_arr = resource.get_property_list().map(func(p): return p.name)
	return ArrayHelper.diff(p_arr, s_arr).filter(func(x):
		return x != 'script' and x != 'Built-in script' \
			and (not x.ends_with('.gd')))