🐚 🔗 TuskLang Bash References Guide
🔗 TuskLang Bash References Guide
"We don't bow to any king" – References are your configuration's network.
References in TuskLang allow you to create connections between values, build dynamic relationships, and avoid duplication. Whether you're linking related settings, creating computed values, or building complex configurations, references provide the flexibility to build interconnected, maintainable systems.
🎯 What are References?
References allow you to refer to other values within your configuration. In TuskLang, references use the$
prefix and enable:
- Value reuse - Reference the same value multiple times
- Computed values - Build values from other values
- Dynamic relationships - Create interconnected configurations
- Maintainability - Change once, update everywhere📝 Syntax Styles
Basic References
[basic]
$base_url: "https://api.example.com"
$api_version: "v1"
full_url: "${base_url}/api/${api_version}"
JSON-like References
{
"config": {
"$protocol": "https",
"$domain": "example.com",
"url": "${protocol}://${domain}"
}
}
XML-inspired References
<config>
<vars>
<protocol>https</protocol>
<domain>example.com</domain>
</vars>
<url>${protocol}://${domain}</url>
</config>
🚀 Quick Start Example
#!/bin/bash
source tusk-bash.shcat > references-quickstart.tsk << 'EOF'
[app]
$app_name: "TuskApp"
$version: "2.1.0"
$environment: @env("APP_ENV", "development")
Use references to build values
full_name: "${app_name} v${version}"
log_file: "/var/log/${app_name}.log"
config_path: "/etc/${app_name}/${environment}.tsk"Computed values using references
$base_port: 8000
$port_offset: 80
server_port: $base_port + $port_offset
EOFconfig=$(tusk_parse references-quickstart.tsk)
echo "Full Name: $(tusk_get "$config" app.full_name)"
echo "Log File: $(tusk_get "$config" app.log_file)"
echo "Config Path: $(tusk_get "$config" app.config_path)"
echo "Server Port: $(tusk_get "$config" app.server_port)"
🔗 Real-World Use Cases
1. URL Construction
[api]
$protocol: "https"
$domain: "api.example.com"
$version: "v1"
base_url: "${protocol}://${domain}"
full_url: "${base_url}/api/${version}"
users_endpoint: "${full_url}/users"
posts_endpoint: "${full_url}/posts"
2. File Path Management
[paths]
$app_name: "myapp"
$environment: @env("APP_ENV", "development")
$base_dir: "/var/www"Build paths using references
app_dir: "${base_dir}/${app_name}"
config_dir: "${app_dir}/config"
log_dir: "${app_dir}/logs"
config_file: "${config_dir}/${environment}.tsk"
log_file: "${log_dir}/${app_name}.log"
3. Database Configuration
[database]
$host: @env("DB_HOST", "localhost")
$port: @env("DB_PORT", "5432")
$name: @env("DB_NAME", "myapp")
$user: @env("DB_USER", "postgres")Build connection strings
connection_string: "postgresql://${user}@${host}:${port}/${name}"
dsn: "pgsql:host=${host};port=${port};dbname=${name}"
4. Server Configuration
[server]
$host: "localhost"
$port: 8080
$ssl: trueComputed values
protocol: @if($ssl, "https", "http")
url: "${protocol}://${host}:${port}"
ssl_cert: @if($ssl, "/etc/ssl/certs/server.crt", null)
ssl_key: @if($ssl, "/etc/ssl/private/server.key", null)
🧠 Advanced Reference Patterns
Nested References
[complex]
$base: {
"protocol": "https",
"domain": "example.com",
"port": 443
}Reference nested values
protocol: $base.protocol
domain: $base.domain
url: "${base.protocol}://${base.domain}:${base.port}"
Conditional References
[conditional]
$environment: @env("APP_ENV", "development")
$dev_host: "localhost"
$prod_host: "0.0.0.0"Conditional references
host: @if($environment == "production", $prod_host, $dev_host)
port: @if($environment == "production", 80, 8080)
debug: @if($environment == "production", false, true)
Circular Reference Prevention
[safe]
$base_url: "https://api.example.com"
$api_path: "/api/v1"Safe references (no circular dependencies)
users_url: "${base_url}${api_path}/users"
posts_url: "${base_url}${api_path}/posts"Avoid this pattern (circular reference):
$url: "${base_url}${api_path}"
$base_url: "${url}/base"
Reference Chains
[chains]
$app_name: "TuskApp"
$version: "2.1.0"
$environment: @env("APP_ENV", "development")Build reference chains
$app_id: "${app_name}-${version}"
$log_prefix: "${app_id}-${environment}"
log_file: "/var/log/${log_prefix}.log"
error_log: "/var/log/${log_prefix}-error.log"
🛡️ Security & Performance Notes
- Reference validation: Ensure referenced values exist before using them. - Circular references: Avoid circular reference patterns that can cause infinite loops. - Performance: Deep reference chains can impact parsing performance. - Security: Be careful with references that include user input or external data.🐞 Troubleshooting
- Undefined references: Check that all referenced variables are defined before use. - Circular references: Look for reference loops that can cause parsing errors. - Type mismatches: Ensure referenced values have compatible types for operations. - Scope issues: Verify references are accessible in the current scope.💡 Best Practices
- Define before use: Always define referenced values before using them. - Use descriptive names: Choose clear, descriptive names for referenced values. - Document relationships: Document the relationships between referenced values. - Test references: Test reference chains to ensure they work as expected. - Avoid deep nesting: Keep reference chains reasonably shallow for maintainability.🔗 Cross-References
- Variables - Key-Value Basics - Conditional Logic---
Master references in TuskLang and build interconnected, maintainable configurations. 🔗