☕ ☕ TuskLang Java Variables Guide
☕ TuskLang Java Variables Guide
"We don't bow to any king" - Java Edition
Master TuskLang variables in Java with comprehensive coverage of variable syntax, Java integration patterns, variable scoping, and best practices for dynamic configuration management.
🎯 Variable Basics
Simple Variables
Define variables
app_name: "My TuskLang App"
version: "1.0.0"
debug: trueUse variables
[app]
name: $app_name
version: $version
debug_mode: $debugVariables with different types
port: 8080
host: "localhost"
ssl_enabled: false
max_connections: 100
Java Variable Access
import org.tusklang.java.TuskLang;
import org.tusklang.java.config.TuskConfig;
import java.util.Map;@TuskConfig
public class VariableConfig {
public String appName;
public String version;
public boolean debug;
public AppConfig app;
}
@TuskConfig
public class AppConfig {
public String name;
public String version;
public boolean debugMode;
}
public class VariablesExample {
public static void main(String[] args) {
TuskLang parser = new TuskLang();
VariableConfig config = parser.parseFile("config.tsk", VariableConfig.class);
// Access variables
System.out.println("App name: " + config.appName);
System.out.println("Version: " + config.version);
System.out.println("Debug: " + config.debug);
// Access nested variables
System.out.println("App config name: " + config.app.name);
System.out.println("App config version: " + config.app.version);
System.out.println("App config debug: " + config.app.debugMode);
}
}
🔄 Variable References
Basic Variable References
Define base variables
base_url: "https://api.example.com"
api_version: "v1"
timeout: 30Use variable references
[api]
base_url: $base_url
version: $api_version
timeout_seconds: $timeout
full_url: $base_url + "/" + $api_version[client]
timeout: $timeout
retry_attempts: 3
max_connections: 100
Java Variable Reference Handling
import org.tusklang.java.TuskLang;
import org.tusklang.java.config.TuskConfig;
import java.util.Map;@TuskConfig
public class ReferenceConfig {
public String baseUrl;
public String apiVersion;
public int timeout;
public ApiConfig api;
public ClientConfig client;
}
@TuskConfig
public class ApiConfig {
public String baseUrl;
public String version;
public int timeoutSeconds;
public String fullUrl;
}
@TuskConfig
public class ClientConfig {
public int timeout;
public int retryAttempts;
public int maxConnections;
}
public class ReferenceExample {
public static void main(String[] args) {
TuskLang parser = new TuskLang();
ReferenceConfig config = parser.parseFile("config.tsk", ReferenceConfig.class);
// Access base variables
System.out.println("Base URL: " + config.baseUrl);
System.out.println("API Version: " + config.apiVersion);
System.out.println("Timeout: " + config.timeout);
// Access referenced variables
System.out.println("API Base URL: " + config.api.baseUrl);
System.out.println("API Full URL: " + config.api.fullUrl);
System.out.println("Client Timeout: " + config.client.timeout);
}
}
📊 Complex Variable Expressions
String Concatenation
String variables
protocol: "https"
domain: "api.example.com"
path: "/users"Complex string expressions
full_url: $protocol + "://" + $domain + $path
api_endpoint: $full_url + "/profile"
health_check: $protocol + "://" + $domain + "/health"Template-style strings
welcome_message: "Welcome to " + $app_name + " v" + $version
error_message: "Error connecting to " + $domain + " on port " + $port
Mathematical Expressions
Numeric variables
base_port: 8000
port_offset: 100
max_workers: 10
timeout_base: 30Mathematical expressions
server_port: $base_port + $port_offset
worker_timeout: $timeout_base * 2
connection_limit: $max_workers * 5
retry_delay: $timeout_base / 2
Boolean Expressions
Boolean variables
development: true
production: false
ssl_available: trueBoolean expressions
debug_enabled: $development && $ssl_available
production_mode: $production
ssl_required: $production || $ssl_available
Java Expression Handling
import org.tusklang.java.TuskLang;
import org.tusklang.java.config.TuskConfig;
import java.util.Map;@TuskConfig
public class ExpressionConfig {
public String protocol;
public String domain;
public String path;
public String fullUrl;
public String apiEndpoint;
public String healthCheck;
public int basePort;
public int portOffset;
public int serverPort;
public int workerTimeout;
public boolean development;
public boolean production;
public boolean sslAvailable;
public boolean debugEnabled;
public boolean sslRequired;
}
public class ExpressionExample {
public static void main(String[] args) {
TuskLang parser = new TuskLang();
ExpressionConfig config = parser.parseFile("config.tsk", ExpressionConfig.class);
// Access computed expressions
System.out.println("Full URL: " + config.fullUrl);
System.out.println("API Endpoint: " + config.apiEndpoint);
System.out.println("Health Check: " + config.healthCheck);
System.out.println("Server Port: " + config.serverPort);
System.out.println("Worker Timeout: " + config.workerTimeout);
System.out.println("Debug Enabled: " + config.debugEnabled);
System.out.println("SSL Required: " + config.sslRequired);
}
}
🔧 Variable Scoping
Global Variables
Global variables (file scope)
app_name: "My TuskLang App"
version: "1.0.0"
environment: "development"All sections can access these variables
[app]
name: $app_name
version: $version[database]
name: $app_name + "_db"
Section-Specific Variables
Global variables
base_url: "https://api.example.com"[api]
Section-specific variables
version: "v1"
timeout: 30
endpoint: $base_url + "/" + $version[client]
Different section-specific variables
timeout: 60
retry_attempts: 3
max_connections: 100
Nested Section Variables
Global variables
app_name: "My App"[application]
Application-level variables
version: "1.0.0"
debug: true[application.database]
Database-specific variables
host: "localhost"
port: 5432
name: $app_name + "_" + $application.version + "_db"[application.server]
Server-specific variables
host: "0.0.0.0"
port: 8080
ssl: $application.debug == false
Java Scoping Integration
import org.tusklang.java.TuskLang;
import org.tusklang.java.config.TuskConfig;
import java.util.Map;@TuskConfig
public class ScopedConfig {
public String appName;
public String version;
public String environment;
public ApplicationConfig application;
}
@TuskConfig
public class ApplicationConfig {
public String version;
public boolean debug;
public DatabaseConfig database;
public ServerConfig server;
}
@TuskConfig
public class DatabaseConfig {
public String host;
public int port;
public String name;
}
@TuskConfig
public class ServerConfig {
public String host;
public int port;
public boolean ssl;
}
public class ScopingExample {
public static void main(String[] args) {
TuskLang parser = new TuskLang();
ScopedConfig config = parser.parseFile("config.tsk", ScopedConfig.class);
// Access global variables
System.out.println("Global App Name: " + config.appName);
System.out.println("Global Version: " + config.version);
System.out.println("Global Environment: " + config.environment);
// Access section variables
System.out.println("App Version: " + config.application.version);
System.out.println("App Debug: " + config.application.debug);
// Access nested section variables
System.out.println("Database: " + config.application.database.host + ":" + config.application.database.port);
System.out.println("Database Name: " + config.application.database.name);
System.out.println("Server: " + config.application.server.host + ":" + config.application.server.port);
System.out.println("Server SSL: " + config.application.server.ssl);
}
}
🔄 Dynamic Variables
Environment Variables
Use environment variables
app_name: @env("APP_NAME", "Default App")
version: @env("APP_VERSION", "1.0.0")
debug: @env("DEBUG", "false")[database]
host: @env("DB_HOST", "localhost")
port: @env("DB_PORT", "5432")
name: @env("DB_NAME", "myapp")
user: @env("DB_USER", "postgres")
password: @env.secure("DB_PASSWORD")
Date and Time Variables
Date and time variables
current_time: @date.now()
formatted_date: @date("yyyy-MM-dd")
start_of_day: @date.startOfDay()
end_of_day: @date.endOfDay()[logging]
timestamp: $current_time
log_file: "app_" + $formatted_date + ".log"
Computed Variables
Computed variables using @ operators
user_count: @query("SELECT COUNT(*) FROM users")
active_sessions: @query("SELECT COUNT(*) FROM sessions WHERE active = true")
system_memory: @php("memory_get_usage(true)")[metrics]
total_users: $user_count
active_users: $active_sessions
memory_usage: $system_memory
Java Dynamic Variable Handling
import org.tusklang.java.TuskLang;
import org.tusklang.java.config.TuskConfig;
import java.util.Map;@TuskConfig
public class DynamicConfig {
public String appName;
public String version;
public boolean debug;
public DatabaseConfig database;
public LoggingConfig logging;
public MetricsConfig metrics;
}
@TuskConfig
public class DatabaseConfig {
public String host;
public int port;
public String name;
public String user;
public String password;
}
@TuskConfig
public class LoggingConfig {
public String timestamp;
public String logFile;
}
@TuskConfig
public class MetricsConfig {
public int totalUsers;
public int activeUsers;
public long memoryUsage;
}
public class DynamicVariablesExample {
public static void main(String[] args) {
TuskLang parser = new TuskLang();
// Set up environment variables for testing
System.setProperty("APP_NAME", "Dynamic App");
System.setProperty("APP_VERSION", "2.0.0");
System.setProperty("DEBUG", "true");
DynamicConfig config = parser.parseFile("config.tsk", DynamicConfig.class);
// Access dynamic variables
System.out.println("Dynamic App Name: " + config.appName);
System.out.println("Dynamic Version: " + config.version);
System.out.println("Dynamic Debug: " + config.debug);
System.out.println("Database: " + config.database.host + ":" + config.database.port);
System.out.println("Log File: " + config.logging.logFile);
System.out.println("Total Users: " + config.metrics.totalUsers);
}
}
🔧 Variable Utilities
Variable Validation
import org.tusklang.java.TuskLang;
import org.tusklang.java.validation.VariableValidator;
import java.util.List;
import java.util.Map;public class VariableValidationExample {
public static void main(String[] args) {
TuskLang parser = new TuskLang();
Map<String, Object> config = parser.parseFile("config.tsk");
// Validate variables
VariableValidator validator = new VariableValidator();
List<String> validationErrors = validator.validateVariables(config);
if (validationErrors.isEmpty()) {
System.out.println("All variables are valid");
} else {
System.out.println("Variable validation errors:");
for (String error : validationErrors) {
System.err.println(" " + error);
}
}
// Check for undefined variables
List<String> undefinedVars = validator.findUndefinedVariables(config);
if (!undefinedVars.isEmpty()) {
System.out.println("Undefined variables:");
for (String var : undefinedVars) {
System.out.println(" " + var);
}
}
}
}
Variable Resolution
import org.tusklang.java.TuskLang;
import org.tusklang.java.variables.VariableResolver;
import java.util.Map;public class VariableResolutionExample {
public static void main(String[] args) {
TuskLang parser = new TuskLang();
Map<String, Object> config = parser.parseFile("config.tsk");
// Resolve variables
VariableResolver resolver = new VariableResolver();
Map<String, Object> resolvedConfig = resolver.resolveAllVariables(config);
System.out.println("Resolved configuration:");
for (Map.Entry<String, Object> entry : resolvedConfig.entrySet()) {
System.out.println(" " + entry.getKey() + ": " + entry.getValue());
}
// Resolve specific variable
String resolvedValue = resolver.resolveVariable("$app_name + ' v' + $version", config);
System.out.println("Resolved expression: " + resolvedValue);
}
}
🧪 Testing Variables
Unit Tests
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.BeforeEach;
import static org.junit.jupiter.api.Assertions.*;
import org.tusklang.java.TuskLang;
import org.tusklang.java.variables.VariableResolver;
import java.util.Map;class VariablesTest {
private TuskLang parser;
private VariableResolver resolver;
@BeforeEach
void setUp() {
parser = new TuskLang();
resolver = new VariableResolver();
}
@Test
void testSimpleVariables() {
String tskContent = """
app_name: "Test App"
version: "1.0.0"
[app]
name: $app_name
version: $version
""";
Map<String, Object> config = parser.parse(tskContent);
Map<String, Object> resolved = resolver.resolveAllVariables(config);
Map<String, Object> appSection = (Map<String, Object>) resolved.get("app");
assertEquals("Test App", appSection.get("name"));
assertEquals("1.0.0", appSection.get("version"));
}
@Test
void testStringConcatenation() {
String tskContent = """
protocol: "https"
domain: "api.example.com"
path: "/users"
full_url: $protocol + "://" + $domain + $path
""";
Map<String, Object> config = parser.parse(tskContent);
Map<String, Object> resolved = resolver.resolveAllVariables(config);
assertEquals("https://api.example.com/users", resolved.get("full_url"));
}
@Test
void testMathematicalExpressions() {
String tskContent = """
base_port: 8000
port_offset: 100
server_port: $base_port + $port_offset
worker_timeout: $base_port / 2
""";
Map<String, Object> config = parser.parse(tskContent);
Map<String, Object> resolved = resolver.resolveAllVariables(config);
assertEquals(8100, resolved.get("server_port"));
assertEquals(4000, resolved.get("worker_timeout"));
}
@Test
void testBooleanExpressions() {
String tskContent = """
development: true
production: false
ssl_available: true
debug_enabled: $development && $ssl_available
ssl_required: $production || $ssl_available
""";
Map<String, Object> config = parser.parse(tskContent);
Map<String, Object> resolved = resolver.resolveAllVariables(config);
assertTrue((Boolean) resolved.get("debug_enabled"));
assertTrue((Boolean) resolved.get("ssl_required"));
}
}
🔧 Troubleshooting
Common Variable Issues
1. Undefined Variables
Error: Variable not defined
app_name: "My App"
version: $undefined_variable # This will cause an errorSolution: Define the variable first
app_name: "My App"
version: "1.0.0"
full_name: $app_name + " v" + $version
2. Circular References
Error: Circular reference
var1: $var2
var2: $var1 # This creates a circular referenceSolution: Use direct values or restructure
var1: "value1"
var2: "value2"
combined: $var1 + " and " + $var2
3. Type Mismatches
Error: String + number without conversion
port: 8080
url: "http://localhost:" + $port # This works in TuskLangSolution: TuskLang handles type conversion automatically
port: 8080
url: "http://localhost:" + $port
📚 Best Practices
Variable Naming
1. Use descriptive names
Good: Descriptive variable names
application_name: "My App"
database_host: "localhost"
max_connection_count: 100Bad: Unclear variable names
app: "My App"
host: "localhost"
max: 100
2. Use consistent naming conventions
Use snake_case for variable names
app_name: "My App"
db_host: "localhost"
api_version: "v1"
ssl_enabled: true
3. Group related variables
Group related variables together
Application settings
app_name: "My App"
app_version: "1.0.0"
app_environment: "development"Database settings
db_host: "localhost"
db_port: 5432
db_name: "myapp"
Variable Organization
1. Define variables at the top
Global variables (define first)
app_name: "My App"
version: "1.0.0"
environment: "development"Use variables in sections
[app]
name: $app_name
version: $version
2. Use sections for organization
Global variables
app_name: "My App"[application]
version: "1.0.0"
debug: true
[database]
host: "localhost"
name: $app_name + "_db"
📚 Next Steps
1. Master variable syntax - Understand all variable types and expressions 2. Implement dynamic variables - Use @ operators for dynamic values 3. Use variable scoping - Organize variables by scope and purpose 4. Add variable validation - Ensure variable integrity and correctness 5. Test variable handling - Create comprehensive variable testing
---
"We don't bow to any king" - You now have complete mastery of TuskLang variables in Java! From simple variables to complex expressions, you can create dynamic, maintainable configurations with proper scoping and validation.