Figments-of-the-Night/addons/inkgd/editor/common/ink_csharp_validator.gd
Gerard Gascón b99855351d init
2025-04-24 17:23:34 +02:00

103 lines
3.3 KiB
GDScript

# ############################################################################ #
# Copyright © 2019-2022 Frédéric Maquin <fred@ephread.com>
# Licensed under the MIT License.
# See LICENSE in the project root for license information.
# ############################################################################ #
extends RefCounted
# A crude validator catching the most common mistakes.
class_name InkCSharpValidator
const INK_ENGINE_RUNTIME = "ink-engine-runtime.dll"
# ############################################################################ #
# Methods
# ############################################################################ #
func validate_csharp_project_files(project_name) -> bool:
var ink_engine_runtime := get_runtime_path()
if ink_engine_runtime.is_empty():
print(
"[inkgd] [INFO] 'ink-engine-runtime.dll' seems to be missing " +
"from the project. If you encounter errors while building the " +
"solution, please refer to [TO BE ADDED] for help."
)
return false
return _validate_csproj(project_name, ink_engine_runtime)
func get_runtime_path() -> String:
return _scan_directory("res://")
func _validate_csproj(project_name: String, runtime_path: String) -> bool:
var csproj_path = "res://%s.csproj" % project_name
if !FileAccess.file_exists(csproj_path):
printerr(
("[inkgd] [ERROR] The C# project (%s.csproj) doesn't exist. " % project_name) +
"You can create a new C# project through " +
"Project > Tools > C# > Create C# Solution. Alternatively, you can also set " +
"Project Settings > General > Inkgd > Do Not Use Mono Runtime to 'Yes' " +
"if you do not wish to use the C# version of Ink. "
)
return false
var file := FileAccess.open(csproj_path, FileAccess.READ)
var error := FileAccess.get_open_error()
if error != OK:
printerr(
"[inkgd] [ERROR] The C# project (%s.csproj) exists but it could not be opened." +
"(Code %d)" % [project_name, error]
)
return false
var content := file.get_as_text()
file.close()
if content.find(runtime_path.replace("res://", "")) == -1:
print(
"[inkgd] [INFO] '%s.csproj' seems to be missing a " % project_name +
"<RefCounted> item matching '%s'. If you encounter " % runtime_path +
"further errors please refer to [TO BE ADDED] for help."
)
return false
print("[inkgd] [INFO] The C# Project seems to be configured correctly.")
return true
func _scan_directory(path) -> String:
var directory := DirAccess.open(path)
var error := DirAccess.get_open_error()
if error != OK:
printerr(
"[inkgd] [ERROR] Could not open '%s', " % path +
"can't look for ink-engine-runtime.dll."
)
return ""
if directory.list_dir_begin() != OK:# TODOConverter3To4 fill missing arguments https://github.com/godotengine/godot/pull/40547
printerr(
"[inkgd] [ERROR] Could not list contents of '%s', " % path +
"can't look for ink-engine-runtime.dll."
)
return ""
var file_name := directory.get_next()
while file_name != "":
if directory.current_is_dir():
var ink_runtime = _scan_directory(
"%s/%s" % [directory.get_current_dir(), file_name]
)
if !ink_runtime.is_empty():
return ink_runtime
else:
if file_name == INK_ENGINE_RUNTIME:
return "%s/%s" % [directory.get_current_dir(), file_name]
file_name = directory.get_next()
return ""