10var json_cache:Dictionary = {}
12var cache_misses:int = 0
16func load_json(path:String) -> Dictionary:
17 var parsed = load_data(path)
18 if parsed
is Dictionary:
24func load_data(path:String):
27 if json_cache.has(path):
29 return _duplicate_cached(json_cache[path])
31 var file := FileAccess.open(path, FileAccess.READ)
35 var parsed = JSON.parse_string(file.get_as_text())
36 if not parsed
is Dictionary
and not parsed
is Array:
39 json_cache[path] = parsed.duplicate(true)
40 return _duplicate_cached(json_cache[path])
44func load_array(path:String, key:String, fallback:Array = []) -> Array:
45 var data := load_json(path)
46 if data.has(key)
and data[key]
is Array:
47 return data[key].duplicate(true)
48 return fallback.duplicate(true)
52func load_root_array(path:String, fallback:Array = []) -> Array:
53 var data = load_data(path)
55 return data.duplicate(true)
56 return fallback.duplicate(true)
60func invalidate(path:String) -> void:
61 json_cache.erase(path)
72func get_cache_state() -> Dictionary:
74 "entries": json_cache.size(),
75 "paths": json_cache.keys(),
76 "cache_hits": cache_hits,
77 "cache_misses": cache_misses
82func get_cache_stats() -> Dictionary:
84 "entries": json_cache.size(),
85 "cache_hits": cache_hits,
86 "cache_misses": cache_misses
90func _duplicate_cached(value):
91 if value
is Dictionary
or value
is Array:
92 return value.duplicate(true)