Add Recipemanager that loads recipes from YAML

This commit is contained in:
JonShard
2026-07-17 13:54:14 +02:00
parent 840908e9ff
commit 4d06e72bc1
133 changed files with 9121 additions and 175 deletions
@@ -0,0 +1,258 @@
extends ExampleBase
const MULTI_DOC_FILE = "res://addons/yaml/examples/data/multi_document.yaml"
const OUTPUT_FILE = "user://multi_document_copy.yaml"
var multi_doc_yaml := """
# Configuration Document
name: MyApplication
version: 1.2.3
environment: production
---
# Database Settings
database:
host: localhost
port: 5432
name: myapp_db
credentials:
username: admin
password: secret123
---
# Feature Flags
features:
enable_new_ui: true
enable_analytics: false
enable_caching: true
max_connections: 100
---
# Logging Configuration
logging:
level: INFO
handlers:
- console
- file
file_path: /var/log/myapp.log
""".replace(" ", " ") # Handle Godot's tab indentation
var parsed_documents
func _init() -> void:
icon = "📑"
func run_examples() -> void:
run_example("Validate Multi-Document YAML", validate_multi_document)
run_example("Parse Multi-Document YAML", parse_multi_document)
run_example("Access Individual Documents", access_individual_documents)
run_example("Work with Document Count", work_with_document_count)
run_example("Process All Documents", process_all_documents)
run_example("Create Multi-Document YAML", create_multi_document)
run_example("Save Multi-Document File", save_multi_document_file)
run_example("Load Multi-Document File", load_multi_document_file)
func validate_multi_document() -> void:
log_info("Validating multi-document YAML string...")
var result := YAML.validate_syntax(multi_doc_yaml)
if result.has_error():
log_error("Validation failed: " + result.get_error())
return
log_success("Multi-document YAML is valid!")
func parse_multi_document() -> void:
log_info("Parsing multi-document YAML...")
var result := YAML.parse(multi_doc_yaml)
if result.has_error():
log_error("Parse failed: " + result.get_error())
return
parsed_documents = result
log_success("Multi-document YAML parsed successfully")
if LOG_VERBOSE:
log_info("Has multiple documents: %s" % result.has_multiple_documents())
log_info("Found " + str(result.get_document_count()) + " documents")
func access_individual_documents() -> void:
# Ensure we have parsed documents
if parsed_documents == null:
parsed_documents = YAML.parse(multi_doc_yaml)
log_info("Accessing individual documents...")
# Access first document (configuration)
var config_doc = parsed_documents.get_document(0)
if config_doc != null:
log_success("Document 0 - Configuration:")
log_info("• App name: " + str(config_doc.name))
log_info("• Version: " + str(config_doc.version))
log_info("• Environment: " + str(config_doc.environment))
# Access second document (database settings)
var db_doc = parsed_documents.get_document(1)
if db_doc != null:
log_success("Document 1 - Database Settings:")
log_info("• Host: " + str(db_doc.database.host))
log_info("• Port: " + str(db_doc.database.port))
log_info("• Database: " + str(db_doc.database.name))
# Access third document (feature flags)
var features_doc = parsed_documents.get_document(2)
if features_doc != null:
log_success("Document 2 - Feature Flags:")
log_info("• New UI enabled: " + str(features_doc.features.enable_new_ui))
log_info("• Analytics enabled: " + str(features_doc.features.enable_analytics))
log_info("• Max connections: " + str(features_doc.features.max_connections))
# Try to access non-existent document
var non_existent = parsed_documents.get_document(10)
if non_existent == null:
log_info("Document 10 (non-existent): null")
func work_with_document_count() -> void:
if parsed_documents == null:
parsed_documents = YAML.parse(multi_doc_yaml)
var count = parsed_documents.get_document_count()
log_info("Total document count: " + str(count))
log_info("Iterating through all documents by index:")
for i in range(count):
var doc = parsed_documents.get_document(i)
var doc_type = "Unknown"
# Identify document type by its content
if doc.has("name") and doc.has("version"):
doc_type = "Configuration"
elif doc.has("database"):
doc_type = "Database Settings"
elif doc.has("features"):
doc_type = "Feature Flags"
elif doc.has("logging"):
doc_type = "Logging Configuration"
log_info("• Document " + str(i) + ": " + doc_type)
func process_all_documents() -> void:
if parsed_documents == null:
parsed_documents = YAML.parse(multi_doc_yaml)
log_info("Processing all documents at once...")
var all_docs = parsed_documents.get_documents()
log_success("Retrieved " + str(all_docs.size()) + " documents as array")
if LOG_VERBOSE:
for i in range(all_docs.size()):
log_info("Document " + str(i) + " keys: " + str(all_docs[i].keys()))
func create_multi_document() -> void:
log_info("Creating multi-document YAML from separate data structures...")
# Create individual document data
var user_doc = {
"user": {
"id": 12345,
"name": "John Doe",
"email": "john@example.com"
}
}
var preferences_doc = {
"preferences": {
"theme": "dark",
"language": "en",
"notifications": true
}
}
var session_doc = {
"session": {
"token": "abc123xyz",
"expires": "2024-12-31T23:59:59Z",
"permissions": ["read", "write"]
}
}
# Convert each to YAML and combine
var documents_yaml = []
for doc_data in [user_doc, preferences_doc, session_doc]:
var result = YAML.stringify(doc_data)
if result.has_error():
log_error("Failed to stringify document: " + result.get_error())
return
documents_yaml.append(result.get_data())
# Combine with document separator
var combined_yaml = "\n---\n".join(documents_yaml)
log_success("Created multi-document YAML successfully")
if LOG_VERBOSE:
log_result(combined_yaml)
# Verify by parsing it back
var verify_result = YAML.parse(combined_yaml)
if !verify_result.has_error():
log_success("Verification: " + str(verify_result.get_document_count()) + " documents parsed")
func save_multi_document_file() -> void:
log_info("Saving multi-document YAML to file: " + OUTPUT_FILE)
# Create sample multi-document data
var documents = [
{"metadata": {"created": "2024-01-01", "version": 1}},
{"data": {"items": [1, 2, 3], "total": 6}},
{"summary": {"status": "complete", "processed": true}}
]
var yaml_parts = []
for doc in documents:
var result = YAML.stringify(doc)
if result.has_error():
log_error("Failed to stringify document: " + result.get_error())
return
yaml_parts.append(result.get_data())
var multi_doc_content = "\n---\n".join(yaml_parts)
# Save to file (note: this saves as plain text, not using YAML.save_file)
var file = FileAccess.open(OUTPUT_FILE, FileAccess.WRITE)
if file == null:
log_error("Failed to open file for writing")
return
file.store_string(multi_doc_content)
file.close()
log_success("Multi-document YAML saved successfully")
if LOG_VERBOSE:
log_result("File content:\n" + multi_doc_content)
func load_multi_document_file() -> void:
log_info("Loading multi-document YAML file: " + OUTPUT_FILE)
# Check if file exists
if !FileAccess.file_exists(OUTPUT_FILE):
log_warning("File doesn't exist. Run 'Save Multi-Document File' first.")
return
var result := YAML.load_file(OUTPUT_FILE)
if result.has_error():
log_error("File loading failed: " + result.get_error())
return
log_success("Multi-document YAML file loaded successfully")
if LOG_VERBOSE:
var doc_count = result.get_document_count()
log_info("Loaded " + str(doc_count) + " documents from file")
for i in range(doc_count):
var doc = result.get_document(i)
log_info("Document " + str(i) + ": " + str(doc.keys()))
log_result(" " + str(doc))