☕ ☕ TuskLang Java Basic Syntax Guide
☕ TuskLang Java Basic Syntax Guide
"We don't bow to any king" - Java Edition
Master TuskLang syntax in Java with comprehensive examples covering all syntax styles, type mapping, validation, and best practices. TuskLang adapts to YOUR preferred syntax style.
🎯 Syntax Flexibility
TuskLang supports three syntax styles - choose the one that feels natural to you:
1. Traditional INI-Style (Sections)
Traditional INI-style configuration
[app]
name: "My Java App"
version: "1.0.0"
debug: true
port: 8080[database]
host: "localhost"
port: 5432
name: "myapp"
user: "postgres"
password: "secret"
[server]
host: "0.0.0.0"
port: 8080
ssl: false
2. JSON-Like Objects (Curly Braces)
JSON-like object syntax
app {
name: "My Java App"
version: "1.0.0"
debug: true
port: 8080
}database {
host: "localhost"
port: 5432
name: "myapp"
user: "postgres"
password: "secret"
}
server {
host: "0.0.0.0"
port: 8080
ssl: false
}
3. XML-Inspired (Angle Brackets)
XML-inspired syntax
app >
name: "My Java App"
version: "1.0.0"
debug: true
port: 8080
<database >
host: "localhost"
port: 5432
name: "myapp"
user: "postgres"
password: "secret"
<
server >
host: "0.0.0.0"
port: 8080
ssl: false
<
🔧 Java Integration
Basic Parsing
import org.tusklang.java.TuskLang;
import java.util.Map;public class BasicSyntaxExample {
public static void main(String[] args) {
TuskLang parser = new TuskLang();
// Parse any syntax style
Map<String, Object> config = parser.parseFile("config.tsk");
// Access values
System.out.println("App name: " + config.get("app"));
System.out.println("Database host: " + config.get("database"));
System.out.println("Server port: " + config.get("server"));
}
}
Type-Safe Configuration Classes
import org.tusklang.java.TuskLang;
import org.tusklang.java.config.TuskConfig;@TuskConfig
public class AppConfig {
public String appName;
public String version;
public boolean debug;
public int port;
public DatabaseConfig database;
public ServerConfig server;
}
@TuskConfig
public class DatabaseConfig {
public String host;
public int port;
public String name;
public String user;
public String password;
}
@TuskConfig
public class ServerConfig {
public String host;
public int port;
public boolean ssl;
}
public class TypeSafeExample {
public static void main(String[] args) {
TuskLang parser = new TuskLang();
// Parse into strongly-typed class
AppConfig config = parser.parseFile("config.tsk", AppConfig.class);
// Type-safe access
System.out.println("App: " + config.appName + " v" + config.version);
System.out.println("Database: " + config.database.host + ":" + config.database.port);
System.out.println("Server: " + config.server.host + ":" + config.server.port);
}
}
📊 Data Types
Primitive Types
String values
app_name: "My Java App"
description: "A powerful application"Numeric values
port: 8080
timeout: 30.5
max_connections: 100Boolean values
debug: true
production: false
ssl_enabled: trueNull values
optional_setting: null
Complex Types
Arrays
[features]
enabled: ["user_management", "payment_processing", "analytics"]
ports: [8080, 8081, 8082]
timeouts: [30, 60, 120]Nested objects
[database]
connection {
host: "localhost"
port: 5432
pool {
min_size: 5
max_size: 20
timeout: 30
}
}Mixed types
[settings]
strings: ["one", "two", "three"]
numbers: [1, 2, 3, 4, 5]
booleans: [true, false, true]
mixed: ["text", 42, true, null]
Java Type Mapping
import org.tusklang.java.TuskLang;
import org.tusklang.java.config.TuskConfig;
import java.util.List;
import java.util.Map;@TuskConfig
public class ComplexConfig {
// Primitive types
public String appName;
public int port;
public double timeout;
public boolean debug;
// Arrays
public List<String> features;
public List<Integer> ports;
public List<Double> timeouts;
// Nested objects
public DatabaseConfig database;
public Map<String, Object> settings;
}
@TuskConfig
public class DatabaseConfig {
public ConnectionConfig connection;
}
@TuskConfig
public class ConnectionConfig {
public String host;
public int port;
public PoolConfig pool;
}
@TuskConfig
public class PoolConfig {
public int minSize;
public int maxSize;
public int timeout;
}
public class DataTypesExample {
public static void main(String[] args) {
TuskLang parser = new TuskLang();
ComplexConfig config = parser.parseFile("config.tsk", ComplexConfig.class);
// Access typed data
System.out.println("Features: " + config.features);
System.out.println("Ports: " + config.ports);
System.out.println("Database pool: " + config.database.connection.pool.minSize);
}
}
🔗 Cross-File References
Import and Reference
Create database.tsk
:
[connection]
host: "localhost"
port: 5432
name: "myapp"
user: "postgres"
password: "secret"[pool]
min_size: 5
max_size: 20
timeout: 30
Create app.tsk
:
Import database configuration
@import("database.tsk")[app]
name: "My App"
version: "1.0.0"
Reference imported values
[database]
connection: @ref("database.connection")
pool_settings: @ref("database.pool")
Java Implementation
import org.tusklang.java.TuskLang;
import java.util.Map;public class CrossFileExample {
public static void main(String[] args) {
TuskLang parser = new TuskLang();
// Parse main file (imports are handled automatically)
Map<String, Object> config = parser.parseFile("app.tsk");
// Access imported values
Map<String, Object> database = (Map<String, Object>) config.get("database");
Map<String, Object> connection = (Map<String, Object>) database.get("connection");
System.out.println("Database host: " + connection.get("host"));
System.out.println("Database port: " + connection.get("port"));
}
}
⚡ @ Operator Integration
Environment Variables
Environment variable integration
[database]
host: @env("DB_HOST", "localhost")
port: @env("DB_PORT", "5432")
password: @env.secure("DB_PASSWORD")[api]
key: @env("API_KEY")
url: @env("API_URL", "https://api.example.com")
Date and Time
[timestamps]
created_at: @date.now()
formatted_date: @date("yyyy-MM-dd HH:mm:ss")
yesterday: @date.subtract("1d")
next_week: @date.add("7d")
Database Queries
[dynamic_data]
user_count: @query("SELECT COUNT(*) FROM users")
active_users: @query("SELECT COUNT(*) FROM users WHERE active = true")
recent_orders: @query("SELECT COUNT(*) FROM orders WHERE created_at > ?", @date.subtract("7d"))
Caching
[expensive_operations]
user_profile: @cache("5m", "get_user_profile", @request.user_id)
analytics: @cache("1h", "get_analytics_data")
Java @ Operator Usage
import org.tusklang.java.TuskLang;
import org.tusklang.java.adapters.PostgreSQLAdapter;
import java.util.Map;public class OperatorExample {
public static void main(String[] args) {
// Setup database adapter
PostgreSQLAdapter db = new PostgreSQLAdapter(PostgreSQLConfig.builder()
.host("localhost")
.port(5432)
.database("myapp")
.user("postgres")
.password("secret")
.build());
TuskLang parser = new TuskLang();
parser.setDatabaseAdapter(db);
// Parse with @ operators
Map<String, Object> config = parser.parseFile("config.tsk");
System.out.println("User count: " + config.get("dynamic_data"));
System.out.println("Cached data: " + config.get("expensive_operations"));
}
}
🔒 Validation and Error Handling
Schema Validation
import org.tusklang.java.TuskLang;
import org.tusklang.java.validation.ValidationResult;
import org.tusklang.java.validation.Validator;public class ValidationExample {
public static void main(String[] args) {
TuskLang parser = new TuskLang();
// Validate configuration
ValidationResult result = parser.validate("config.tsk");
if (result.isValid()) {
System.out.println("✅ Configuration is valid");
Map<String, Object> config = parser.parseFile("config.tsk");
} else {
System.out.println("❌ Configuration errors:");
result.getErrors().forEach(error ->
System.err.println(" - " + error.getMessage())
);
}
}
}
Custom Validation
import org.tusklang.java.validation.Validator;
import org.tusklang.java.validation.ValidationRule;
import java.util.Map;public class CustomValidationExample {
public static void main(String[] args) {
Validator validator = new Validator();
// Add custom validation rules
validator.addRule(new ValidationRule("port", value -> {
int port = Integer.parseInt(value.toString());
return port > 0 && port <= 65535;
}, "Port must be between 1 and 65535"));
validator.addRule(new ValidationRule("database.host", value -> {
return value != null && !value.toString().isEmpty();
}, "Database host is required"));
TuskLang parser = new TuskLang();
parser.setValidator(validator);
ValidationResult result = parser.validate("config.tsk");
if (result.isValid()) {
System.out.println("✅ Configuration passed custom validation");
}
}
}
🔧 Advanced Syntax Features
Conditional Configuration
Environment-based configuration
[production]
debug: false
log_level: "ERROR"
cache_ttl: "1h"[development]
debug: true
log_level: "DEBUG"
cache_ttl: "5m"
Conditional loading
@if(@env("APP_ENV") == "production")
@include("production.tsk")
@else
@include("development.tsk")
@endif
Template Variables
Define variables
@var base_url = "https://api.example.com"
@var version = "v1"[api]
base_url: @var("base_url")
version: @var("version")
endpoints {
users: @var("base_url") + "/" + @var("version") + "/users"
orders: @var("base_url") + "/" + @var("version") + "/orders"
}
Java Conditional Processing
import org.tusklang.java.TuskLang;
import java.util.Map;public class ConditionalExample {
public static void main(String[] args) {
TuskLang parser = new TuskLang();
// Set environment variable
System.setProperty("APP_ENV", "production");
// Parse with conditional logic
Map<String, Object> config = parser.parseFile("config.tsk");
// Access environment-specific configuration
String env = System.getProperty("APP_ENV", "development");
Map<String, Object> envConfig = (Map<String, Object>) config.get(env);
System.out.println("Environment: " + env);
System.out.println("Debug: " + envConfig.get("debug"));
System.out.println("Log level: " + envConfig.get("log_level"));
}
}
📝 Best Practices
1. Consistent Syntax Style
Choose one syntax style and stick to it throughout your project:
Good: Consistent INI-style
[app]
name: "My App"[database]
host: "localhost"
Avoid mixing styles in the same file
2. Meaningful Section Names
Good: Clear, descriptive names
[user_management]
[payment_processing]
[analytics_dashboard]Avoid: Generic names
[config]
[settings]
[data]
3. Type Safety
// Good: Use @TuskConfig classes
@TuskConfig
public class AppConfig {
public String appName;
public int port;
}// Avoid: Raw Map access when possible
Map<String, Object> config = parser.parseFile("config.tsk");
String appName = (String) config.get("app");
4. Error Handling
// Good: Comprehensive error handling
try {
AppConfig config = parser.parseFile("config.tsk", AppConfig.class);
// Use configuration
} catch (TuskParseException e) {
System.err.println("Configuration parsing failed: " + e.getMessage());
System.exit(1);
} catch (ValidationException e) {
System.err.println("Configuration validation failed: " + e.getMessage());
System.exit(1);
}
5. Environment Separation
Good: Environment-specific files
config/
├── base.tsk
├── development.tsk
├── staging.tsk
└── production.tskUse @import to compose configurations
@import("config/base.tsk")
@import("config/" + @env("APP_ENV") + ".tsk")
🎯 Performance Considerations
1. Lazy Loading
Use @lazy for expensive operations
[expensive_data]
user_profiles: @lazy("load_user_profiles")
analytics: @lazy("load_analytics_data")
2. Caching
Cache frequently accessed data
[cached_data]
user_count: @cache("5m", "get_user_count")
system_status: @cache("1m", "get_system_status")
3. Parallel Processing
Use @async for independent operations
[parallel_data]
data1: @async("operation1")
data2: @async("operation2")
data3: @async("operation3")
🔧 Troubleshooting
Common Syntax Errors
1. Missing Section Brackets
Error: Missing closing bracket
[app
name: "My App"Fix: Add closing bracket
[app]
name: "My App"
2. Invalid Type Conversion
Error: String to int conversion
port: "8080" # String
Fix: Use number
port: 8080 # Integer
3. Unclosed Objects
Error: Unclosed object
database {
host: "localhost"
# Missing closing braceFix: Close object
database {
host: "localhost"
}
Debug Mode
import org.tusklang.java.TuskLang;public class DebugExample {
public static void main(String[] args) {
TuskLang parser = new TuskLang();
parser.setDebug(true); // Enable debug logging
Map<String, Object> config = parser.parseFile("config.tsk");
System.out.println("Parsed configuration: " + config);
}
}
📚 Next Steps
1. Master @ operators - Environment variables, caching, database queries 2. Explore FUJSEN - Execute JavaScript functions in configuration 3. Integrate with Spring Boot - Build web applications 4. Add validation - Ensure configuration integrity 5. Optimize performance - Use caching and lazy loading
---
"We don't bow to any king" - You now have complete mastery of TuskLang syntax in Java! Choose your preferred style, leverage type safety, and build powerful configurations that adapt to your needs.