☕ ☕ TuskLang Java Sections Guide
☕ TuskLang Java Sections Guide
"We don't bow to any king" - Java Edition
Master TuskLang sections in Java with comprehensive coverage of section syntax, Java integration patterns, nested sections, and best practices for organizing configuration data.
🎯 Section Basics
Traditional INI-Style Sections
Basic sections
[app]
name: "My TuskLang App"
version: "1.0.0"
debug: true[database]
host: "localhost"
port: 5432
name: "myapp"
user: "postgres"
password: "secret"
[server]
host: "0.0.0.0"
port: 8080
ssl: false
Java Section Mapping
import org.tusklang.java.TuskLang;
import org.tusklang.java.config.TuskConfig;
import java.util.Map;@TuskConfig
public class AppConfig {
public String name;
public String version;
public boolean debug;
}
@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;
}
@TuskConfig
public class MainConfig {
public AppConfig app;
public DatabaseConfig database;
public ServerConfig server;
}
public class SectionsExample {
public static void main(String[] args) {
TuskLang parser = new TuskLang();
MainConfig config = parser.parseFile("config.tsk", MainConfig.class);
// Access section data
System.out.println("App: " + config.app.name + " v" + config.app.version);
System.out.println("Database: " + config.database.host + ":" + config.database.port);
System.out.println("Server: " + config.server.host + ":" + config.server.port);
}
}
🔄 Alternative Syntax Styles
JSON-Like Objects
JSON-like object syntax
app {
name: "My TuskLang App"
version: "1.0.0"
debug: true
}database {
host: "localhost"
port: 5432
name: "myapp"
user: "postgres"
password: "secret"
}
server {
host: "0.0.0.0"
port: 8080
ssl: false
}
XML-Inspired Syntax
XML-inspired syntax
app >
name: "My TuskLang App"
version: "1.0.0"
debug: true
<database >
host: "localhost"
port: 5432
name: "myapp"
user: "postgres"
password: "secret"
<
server >
host: "0.0.0.0"
port: 8080
ssl: false
<
Java Integration with Different Syntax
import org.tusklang.java.TuskLang;
import org.tusklang.java.config.TuskConfig;@TuskConfig
public class FlexibleConfig {
public AppConfig app;
public DatabaseConfig database;
public ServerConfig server;
}
public class FlexibleSyntaxExample {
public static void main(String[] args) {
TuskLang parser = new TuskLang();
// Parse different syntax styles
FlexibleConfig iniConfig = parser.parseFile("config-ini.tsk", FlexibleConfig.class);
FlexibleConfig jsonConfig = parser.parseFile("config-json.tsk", FlexibleConfig.class);
FlexibleConfig xmlConfig = parser.parseFile("config-xml.tsk", FlexibleConfig.class);
// All produce the same Java objects
System.out.println("INI: " + iniConfig.app.name);
System.out.println("JSON: " + jsonConfig.app.name);
System.out.println("XML: " + xmlConfig.app.name);
}
}
📊 Nested Sections
Deep Nesting
[application]
name: "My App"
version: "1.0.0"[application.database]
host: "localhost"
port: 5432
name: "myapp"
[application.database.connection]
pool_size: 10
timeout: 30
retry_attempts: 3
[application.database.connection.ssl]
enabled: true
cert_file: "/path/to/cert.pem"
key_file: "/path/to/key.pem"
[application.server]
host: "0.0.0.0"
port: 8080
[application.server.security]
ssl_enabled: true
cors_enabled: true
rate_limiting: true
[application.server.security.cors]
allowed_origins: ["http://localhost:3000", "https://example.com"]
allowed_methods: ["GET", "POST", "PUT", "DELETE"]
allowed_headers: ["Content-Type", "Authorization"]
Java Nested Section Mapping
import org.tusklang.java.TuskLang;
import org.tusklang.java.config.TuskConfig;
import java.util.List;@TuskConfig
public class ApplicationConfig {
public String name;
public String version;
public DatabaseConfig database;
public ServerConfig server;
}
@TuskConfig
public class DatabaseConfig {
public String host;
public int port;
public String name;
public ConnectionConfig connection;
}
@TuskConfig
public class ConnectionConfig {
public int poolSize;
public int timeout;
public int retryAttempts;
public SSLConfig ssl;
}
@TuskConfig
public class SSLConfig {
public boolean enabled;
public String certFile;
public String keyFile;
}
@TuskConfig
public class ServerConfig {
public String host;
public int port;
public SecurityConfig security;
}
@TuskConfig
public class SecurityConfig {
public boolean sslEnabled;
public boolean corsEnabled;
public boolean rateLimiting;
public CORSConfig cors;
}
@TuskConfig
public class CORSConfig {
public List<String> allowedOrigins;
public List<String> allowedMethods;
public List<String> allowedHeaders;
}
public class NestedSectionsExample {
public static void main(String[] args) {
TuskLang parser = new TuskLang();
ApplicationConfig config = parser.parseFile("config.tsk", ApplicationConfig.class);
// Access deeply nested properties
System.out.println("App: " + config.name + " v" + config.version);
System.out.println("Database: " + config.database.host + ":" + config.database.port);
System.out.println("Pool size: " + config.database.connection.poolSize);
System.out.println("SSL enabled: " + config.database.connection.ssl.enabled);
System.out.println("Server: " + config.server.host + ":" + config.server.port);
System.out.println("CORS origins: " + config.server.security.cors.allowedOrigins);
}
}
🔧 Section Access Patterns
Direct Section Access
import org.tusklang.java.TuskLang;
import java.util.Map;public class DirectAccessExample {
public static void main(String[] args) {
TuskLang parser = new TuskLang();
Map<String, Object> config = parser.parseFile("config.tsk");
// Access sections directly
Map<String, Object> appSection = (Map<String, Object>) config.get("app");
Map<String, Object> dbSection = (Map<String, Object>) config.get("database");
Map<String, Object> serverSection = (Map<String, Object>) config.get("server");
// Access section properties
String appName = (String) appSection.get("name");
String dbHost = (String) dbSection.get("host");
Integer serverPort = (Integer) serverSection.get("port");
System.out.println("App: " + appName);
System.out.println("Database: " + dbHost);
System.out.println("Server port: " + serverPort);
}
}
Nested Section Access
import org.tusklang.java.TuskLang;
import java.util.Map;public class NestedAccessExample {
public static void main(String[] args) {
TuskLang parser = new TuskLang();
Map<String, Object> config = parser.parseFile("config.tsk");
// Access nested sections
Map<String, Object> appSection = (Map<String, Object>) config.get("application");
Map<String, Object> dbSection = (Map<String, Object>) appSection.get("database");
Map<String, Object> connSection = (Map<String, Object>) dbSection.get("connection");
Map<String, Object> sslSection = (Map<String, Object>) connSection.get("ssl");
// Access deeply nested properties
String appName = (String) appSection.get("name");
String dbHost = (String) dbSection.get("host");
Integer poolSize = (Integer) connSection.get("pool_size");
Boolean sslEnabled = (Boolean) sslSection.get("enabled");
System.out.println("App: " + appName);
System.out.println("Database: " + dbHost);
System.out.println("Pool size: " + poolSize);
System.out.println("SSL enabled: " + sslEnabled);
}
}
Section Path Access
import org.tusklang.java.TuskLang;
import java.util.Map;public class PathAccessExample {
public static void main(String[] args) {
TuskLang parser = new TuskLang();
Map<String, Object> config = parser.parseFile("config.tsk");
// Access using dot notation paths
String appName = parser.get("application.name");
String dbHost = parser.get("application.database.host");
Integer poolSize = parser.get("application.database.connection.pool_size");
Boolean sslEnabled = parser.get("application.database.connection.ssl.enabled");
System.out.println("App: " + appName);
System.out.println("Database: " + dbHost);
System.out.println("Pool size: " + poolSize);
System.out.println("SSL enabled: " + sslEnabled);
// Set values using paths
parser.set("application.database.connection.pool_size", 20);
parser.set("application.server.security.rate_limiting", false);
}
}
🔄 Section Inheritance and Overrides
Base Configuration
Create base.tsk
:
[app]
name: "Base App"
version: "1.0.0"
debug: false[database]
host: "localhost"
port: 5432
name: "base_app"
user: "postgres"
password: "secret"
[server]
host: "0.0.0.0"
port: 8080
ssl: false
Environment-Specific Overrides
Create development.tsk
:
Import base configuration
@import("base.tsk")Override for development
[app]
debug: true[database]
name: "dev_app"
[server]
port: 3000
Create production.tsk
:
Import base configuration
@import("base.tsk")Override for production
[app]
name: "Production App"[database]
host: "prod-db.example.com"
password: @env.secure("DB_PASSWORD")
[server]
host: "prod-server.example.com"
port: 443
ssl: true
Java Section Inheritance
import org.tusklang.java.TuskLang;
import org.tusklang.java.config.TuskConfig;@TuskConfig
public class EnvironmentConfig {
public AppConfig app;
public DatabaseConfig database;
public ServerConfig server;
}
public class InheritanceExample {
public static void main(String[] args) {
TuskLang parser = new TuskLang();
// Load environment-specific configuration
String environment = System.getProperty("APP_ENV", "development");
EnvironmentConfig config = parser.parseFile(environment + ".tsk", EnvironmentConfig.class);
System.out.println("Environment: " + environment);
System.out.println("App: " + config.app.name + " (debug: " + config.app.debug + ")");
System.out.println("Database: " + config.database.host + ":" + config.database.port);
System.out.println("Server: " + config.server.host + ":" + config.server.port + " (ssl: " + config.server.ssl + ")");
}
}
📊 Section Arrays and Lists
Array of Sections
[servers]
server1 {
name: "web-server-1"
host: "192.168.1.10"
port: 8080
role: "web"
}server2 {
name: "web-server-2"
host: "192.168.1.11"
port: 8080
role: "web"
}
server3 {
name: "db-server-1"
host: "192.168.1.20"
port: 5432
role: "database"
}
[databases]
db1 {
name: "users"
host: "db1.example.com"
port: 5432
type: "postgresql"
}
db2 {
name: "analytics"
host: "db2.example.com"
port: 27017
type: "mongodb"
}
Java Array Section Mapping
import org.tusklang.java.TuskLang;
import org.tusklang.java.config.TuskConfig;
import java.util.List;@TuskConfig
public class InfrastructureConfig {
public List<ServerConfig> servers;
public List<DatabaseConfig> databases;
}
@TuskConfig
public class ServerConfig {
public String name;
public String host;
public int port;
public String role;
}
@TuskConfig
public class DatabaseConfig {
public String name;
public String host;
public int port;
public String type;
}
public class ArraySectionsExample {
public static void main(String[] args) {
TuskLang parser = new TuskLang();
InfrastructureConfig config = parser.parseFile("config.tsk", InfrastructureConfig.class);
// Process server array
System.out.println("Servers:");
for (ServerConfig server : config.servers) {
System.out.println(" " + server.name + " (" + server.role + ") at " + server.host + ":" + server.port);
}
// Process database array
System.out.println("Databases:");
for (DatabaseConfig db : config.databases) {
System.out.println(" " + db.name + " (" + db.type + ") at " + db.host + ":" + db.port);
}
// Filter servers by role
List<ServerConfig> webServers = config.servers.stream()
.filter(s -> "web".equals(s.role))
.collect(Collectors.toList());
System.out.println("Web servers: " + webServers.size());
}
}
🔧 Section Utilities
Section Validation
import org.tusklang.java.TuskLang;
import org.tusklang.java.validation.Validator;
import org.tusklang.java.validation.ValidationRule;
import java.util.Map;public class SectionValidationExample {
public static void main(String[] args) {
Validator validator = new Validator();
// Add section-specific validation rules
validator.addRule(new ValidationRule("app.name", value -> {
return value != null && !value.toString().isEmpty();
}, "App name is required"));
validator.addRule(new ValidationRule("database.host", value -> {
return value != null && !value.toString().isEmpty();
}, "Database host is required"));
validator.addRule(new ValidationRule("database.port", value -> {
int port = Integer.parseInt(value.toString());
return port > 0 && port <= 65535;
}, "Database port must be between 1 and 65535"));
TuskLang parser = new TuskLang();
parser.setValidator(validator);
// Parse with section validation
Map<String, Object> config = parser.parseFile("config.tsk");
System.out.println("Configuration validated successfully");
}
}
Section Merging
import org.tusklang.java.TuskLang;
import java.util.Map;
import java.util.HashMap;public class SectionMergingExample {
public static void main(String[] args) {
TuskLang parser = new TuskLang();
// Parse multiple configuration files
Map<String, Object> baseConfig = parser.parseFile("base.tsk");
Map<String, Object> overrideConfig = parser.parseFile("override.tsk");
// Merge configurations
Map<String, Object> mergedConfig = mergeConfigs(baseConfig, overrideConfig);
System.out.println("Merged configuration: " + mergedConfig);
}
private static Map<String, Object> mergeConfigs(Map<String, Object> base, Map<String, Object> override) {
Map<String, Object> merged = new HashMap<>(base);
for (Map.Entry<String, Object> entry : override.entrySet()) {
String key = entry.getKey();
Object value = entry.getValue();
if (value instanceof Map && merged.get(key) instanceof Map) {
// Recursively merge nested maps
@SuppressWarnings("unchecked")
Map<String, Object> baseMap = (Map<String, Object>) merged.get(key);
@SuppressWarnings("unchecked")
Map<String, Object> overrideMap = (Map<String, Object>) value;
merged.put(key, mergeConfigs(baseMap, overrideMap));
} else {
// Override with new value
merged.put(key, value);
}
}
return merged;
}
}
🧪 Testing Sections
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 java.util.Map;class SectionsTest {
private TuskLang parser;
@BeforeEach
void setUp() {
parser = new TuskLang();
}
@Test
void testBasicSections() {
String tskContent = """
[app]
name: "Test App"
version: "1.0.0"
[database]
host: "localhost"
port: 5432
""";
Map<String, Object> config = parser.parse(tskContent);
Map<String, Object> appSection = (Map<String, Object>) config.get("app");
Map<String, Object> dbSection = (Map<String, Object>) config.get("database");
assertEquals("Test App", appSection.get("name"));
assertEquals("1.0.0", appSection.get("version"));
assertEquals("localhost", dbSection.get("host"));
assertEquals(5432, dbSection.get("port"));
}
@Test
void testNestedSections() {
String tskContent = """
[app]
name: "Test App"
[app.database]
host: "localhost"
port: 5432
[app.database.connection]
pool_size: 10
timeout: 30
""";
Map<String, Object> config = parser.parse(tskContent);
Map<String, Object> appSection = (Map<String, Object>) config.get("app");
Map<String, Object> dbSection = (Map<String, Object>) appSection.get("database");
Map<String, Object> connSection = (Map<String, Object>) dbSection.get("connection");
assertEquals("Test App", appSection.get("name"));
assertEquals("localhost", dbSection.get("host"));
assertEquals(10, connSection.get("pool_size"));
assertEquals(30, connSection.get("timeout"));
}
@Test
void testSectionPathAccess() {
String tskContent = """
[app]
name: "Test App"
[app.database]
host: "localhost"
port: 5432
""";
parser.parse(tskContent);
assertEquals("Test App", parser.get("app.name"));
assertEquals("localhost", parser.get("app.database.host"));
assertEquals(5432, parser.get("app.database.port"));
}
}
🔧 Troubleshooting
Common Section Issues
1. Section Not Found
// Check if section exists
Map<String, Object> config = parser.parseFile("config.tsk");
if (config.containsKey("database")) {
Map<String, Object> dbSection = (Map<String, Object>) config.get("database");
// Use dbSection
} else {
System.err.println("Database section not found");
}
2. Nested Section Access
// Safe nested access
Map<String, Object> config = parser.parseFile("config.tsk");
Map<String, Object> appSection = (Map<String, Object>) config.get("app");
if (appSection != null) {
Map<String, Object> dbSection = (Map<String, Object>) appSection.get("database");
if (dbSection != null) {
String host = (String) dbSection.get("host");
// Use host
}
}
3. Section Type Issues
// Validate section type
Object section = config.get("database");
if (section instanceof Map) {
@SuppressWarnings("unchecked")
Map<String, Object> dbSection = (Map<String, Object>) section;
// Use dbSection
} else {
System.err.println("Database section is not a map");
}
📚 Next Steps
1. Master section syntax - Understand all section styles and patterns 2. Implement nested sections - Build complex hierarchical configurations 3. Use section inheritance - Create reusable base configurations 4. Add section validation - Validate section structure and content 5. Test section handling - Create comprehensive section testing
---
"We don't bow to any king" - You now have complete mastery of TuskLang sections in Java! From basic sections to complex nested structures, you can organize and access configuration data efficiently with type safety and validation.