48 lines
1.8 KiB
GDScript
48 lines
1.8 KiB
GDScript
class_name CliSceneLauncher
|
|
extends RefCounted
|
|
## Pure command-line argument parser for the Sandbox Stage scene loader.
|
|
## No scene-tree or OS access, so it is directly unit-testable. Parses
|
|
## OS.get_cmdline_user_args() output into a structured {scene_path, play, error}
|
|
## result; the caller (SandboxStage) is responsible for the error dialog and
|
|
## autosave policy.
|
|
|
|
static func parse(args: Array) -> Dictionary:
|
|
var scene_path := ""
|
|
var play := false
|
|
var used_scene_flag := false
|
|
var used_positional := false
|
|
var error := ""
|
|
var i := 0
|
|
while i < args.size():
|
|
var token := String(args[i])
|
|
if token == "--play":
|
|
play = true
|
|
elif token == "--scene":
|
|
used_scene_flag = true
|
|
if i + 1 >= args.size():
|
|
return {"scene_path": "", "play": play, "error": "--scene requires a path."}
|
|
var value := String(args[i + 1])
|
|
if value.is_empty():
|
|
return {"scene_path": "", "play": play, "error": "--scene requires a path."}
|
|
scene_path = value
|
|
i += 1
|
|
elif token.begins_with("--scene="):
|
|
used_scene_flag = true
|
|
var value := token.substr("--scene=".length())
|
|
if value.is_empty():
|
|
return {"scene_path": "", "play": play, "error": "--scene requires a path."}
|
|
scene_path = value
|
|
elif token.begins_with("--"):
|
|
return {"scene_path": "", "play": play, "error": "Unknown option: %s" % token}
|
|
else:
|
|
if used_positional:
|
|
return {"scene_path": "", "play": play, "error": "Specify the scene with either --scene or a single positional path."}
|
|
used_positional = true
|
|
scene_path = token
|
|
i += 1
|
|
if used_scene_flag and used_positional:
|
|
error = "Specify the scene with either --scene or a single positional path."
|
|
elif play and scene_path.is_empty():
|
|
error = "--play requires --scene <path>."
|
|
return {"scene_path": scene_path, "play": play, "error": error}
|