aboutsummaryrefslogtreecommitdiff
path: root/logic/settings.gd
blob: 51f0e30de81e8dc9f2232b6d885342e1fa8a51df (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
extends Reference
class_name Settings

const SETTINGS_FILE_PATH	:= "user://settings.json"
const SETTINGS_FILE_VERSION	:= "SETTINGS_V1"

var settings				: Dictionary
var defer_save				:= false


func _init():
	load_settings()


func set_value(name: String, value) -> void:
	settings[name] = value
	if defer_save == false:
		save_settings()


func get_value(name: String, default = null):
	if settings.has(name) == false:
		printerr("Setting '%s' not found." % name)
	
	return settings.get(name, default)


func remove_value(name: String) -> void:
	settings.erase(name)
	if defer_save == false:
		save_settings()


func save_settings(file_path: String = SETTINGS_FILE_PATH):
	match file_path.get_extension():
		"json":
			export_json(file_path, settings)
		
		_:
			printerr("Invalid settings file extension '%s', expected 'json'." % file_path.get_file())
			return


static func export_json(file_path: String, data: Dictionary):
	var settings_file := {
		"version": SETTINGS_FILE_VERSION,
		"settings": data,
	}
	var indentation_char := "" if file_path == SETTINGS_FILE_PATH else "\t"
	var file_content := JSON.print(settings_file, indentation_char)
	
	var file := File.new()
	file.open(file_path, File.WRITE)
	file.store_string(file_content)
	file.close()


func load_settings(file_path: String = SETTINGS_FILE_PATH):
	match file_path.get_extension():
		"json":
			settings = import_json(file_path)
		
		_:
			printerr("Invalid settings file extension '%s', expected 'json'." % file_path.get_file())
			return


static func import_json(file_path: String) -> Dictionary:
	var result := {}
	
	var file := File.new()
	var error := file.open(file_path, File.READ_WRITE)
	if error != OK:
		printerr("Failed to open settings file '%s' (error %d)." % [file_path, error])
		return result
	var file_content = file.get_as_text()
	file.close()
	var parse_result = JSON.parse(file_content)
	
	# @DAM All these import/export json functions in database/state/settings could maybe be abstracted!?
	
#	if parse_result.error != OK:
#		printerr("Failed to parse settings file '%s' (error %d)." % [file_path, parse_result.error])
#	elif typeof(parse_result.result) != TYPE_DICTIONARY:
#		printerr("Invalid settings file type '%s', expected '%s'." % [typeof(parse_result.result), TYPE_DICTIONARY])
#	elif parse_result.result["version"] != SETTINGS_FILE_VERSION:
#		printerr("Invalid settings file version '%s', expected '%s'." % [parse_result.result["version"], SETTINGS_FILE_VERSION])
#	elif typeof(parse_result.result["settings"]) != TYPE_ARRAY:
#		printerr("Invalid settings content type '%s', expected '%s'." % [typeof(parse_result.result["settings"]), TYPE_DICTIONARY])
#	else:
#		result = parse_result.result["settings"]
	
	
#	WIP WIP WIP
#	Decide on how to print errors.
#	Maybe use error checking as defined above.
#	Maybe create parameterized functions to import/export JSON files.
	
	if parse_result.error != OK:
		printerr("Failed to parse settings file '%s' (error %d)." % [file_path, parse_result.error])
		return result
	
	if typeof(parse_result.result) != TYPE_DICTIONARY:
		print_stack() # @DAM Decide on how to print errors ... once and for all!
		printerr("Invalid settings file type '%s', expected '%s'." % [typeof(parse_result.result), TYPE_DICTIONARY])
		return result
	
	if parse_result.result["version"] != SETTINGS_FILE_VERSION:
		printerr("Invalid settings file version '%s', expected '%s'." % [parse_result.result["version"], SETTINGS_FILE_VERSION])
		return result
	
	if typeof(parse_result.result["settings"]) != TYPE_DICTIONARY:
		printerr("Invalid settings content type '%s', expected '%s'." % [typeof(parse_result.result["settings"]), TYPE_DICTIONARY])
		return result
	
	result = parse_result.result["settings"]
	return result