57 lines
2.0 KiB
GDScript
57 lines
2.0 KiB
GDScript
extends RefCounted
|
|
## Sparse whole typed captures. No acceptance flags and no truncation.
|
|
const Codec := preload("res://tests/fixtures/p08-02/mixed_world.gd")
|
|
var directory: String
|
|
var manifest: FileAccess
|
|
|
|
func open(path: String) -> bool:
|
|
directory = path
|
|
if DirAccess.dir_exists_absolute(path):
|
|
return false
|
|
if DirAccess.make_dir_recursive_absolute(path.path_join("objects")) != OK:
|
|
return false
|
|
manifest = FileAccess.open(path.path_join("manifest.jsonl"), FileAccess.WRITE)
|
|
return manifest != null
|
|
|
|
func object(value: Variant) -> String:
|
|
var text := JSON.stringify(Codec.new().typed(value)) + "\n"
|
|
var digest := text.sha256_text()
|
|
var path := directory.path_join("objects").path_join(digest + ".json")
|
|
if FileAccess.file_exists(path):
|
|
return digest if FileAccess.get_sha256(path) == digest else ""
|
|
var file := FileAccess.open(path, FileAccess.WRITE)
|
|
if file == null:
|
|
return ""
|
|
file.store_string(text)
|
|
file.close()
|
|
return digest if FileAccess.get_sha256(path) == digest else ""
|
|
|
|
func capture(label: String, runtime: Variant, view: WorldPreview) -> bool:
|
|
if manifest == null:
|
|
return false
|
|
var state: Dictionary = runtime.create_snapshot()
|
|
var report := view.get_life_observation_report()
|
|
var state_hash := object(state)
|
|
var report_hash := object(report)
|
|
if state_hash.is_empty() or report_hash.is_empty():
|
|
return false
|
|
manifest.store_line(JSON.stringify({"label": label, "pid": OS.get_process_id(),
|
|
"ticks_usec": Time.get_ticks_usec(), "state": state_hash, "report": report_hash,
|
|
"input_method": "diagnostic", "acceptance": "pending"}))
|
|
manifest.flush()
|
|
return var_to_bytes(state) == var_to_bytes(runtime.create_snapshot())
|
|
|
|
func close() -> void:
|
|
if manifest != null:
|
|
manifest.close()
|
|
manifest = null
|
|
|
|
func record(label: String, value: Dictionary) -> bool:
|
|
if manifest == null: return false
|
|
var digest := object(value)
|
|
if digest.is_empty(): return false
|
|
manifest.store_line(JSON.stringify({"label": label, "pid": OS.get_process_id(),
|
|
"ticks_usec": Time.get_ticks_usec(), "object": digest}))
|
|
manifest.flush()
|
|
return true
|