Repository files navigation

AutoDSL for Kotlin

Auto-generates DSL (Domain Specific Language) for your Kotlin projects using annotations.

Inspired by AutoDsl, which is no longer maintained.

Documentation

For a concise feature guide, see Features.

Create expressive, immutable and type-safe DSL without boilerplate code:

person {
name ="Juan"
age =34
address {
street ="200 Celebration Bv"
zipCode =34747
location {
lat =100.0
lng =100.0
}
}
friend {
name ="Arturo"
age =28
}
friend {
name ="Tiwa"
age =30
}
}

To generate the previous DSL you just need to provide your desired classes with @AutoDsl:

@AutoDsl
classPerson(
valname:String,
valage:Int,
valaddress:Address?,
valfriends:List<Person> = emptyList(),
//in some cases you'll need to provide a valid singular form manually
@AutoDslSingular("clazz")
valclasses:List<Person> = emptyList()
)
@AutoDsl
data classAddress(
valstreet:String,
valzipCode:Int,
vallocation:Location?
)
@AutoDsl
classLocation {
val lat:Doubleval lng:Doubleconstructor() {
lat =0.0
lng =0.0
}
// with multiple constructors you can specify which one to use.
@AutoDslConstructor
constructor(lat:Double, lng:Double) {
this.lat = lat
this.lng = lng
}
}

AutoDsl will be generating a builder class and extension function for the annotated class providing this super expressive DSL.

For required parameters like name the DSL will throw an exception at runtime. To make it optional just set the property as nullable with the question mark like address, or provide a default value like friends. The value will be null in case it's not set.

For inspections on required parameters use this IntelliJ plugin.

Default values are supported!

Usage

You can use either ksp or kapt to run this processor. See here for a comparison of ksp and kapt.

1.a) Add dependencies (Kotlin Symbol Processing (KSP)):

settings.gradle.kts:

pluginManagement {
repositories {
gradlePluginPortal()
google() //required for ksp
}
}

build.gradle.kts:

plugins {
id("com.google.devtools.ksp") version "<latest ksp version>"//check https://github.com/google/ksp/releases
}
repositories {
mavenCentral()
google()
}
dependencies {
val autoDslVersion ="<latest version>"//check https://github.com/F43nd1r/autodsl-ksp/releases
implementation("com.faendir.kotlin.autodsl:annotations:$autoDslVersion")
ksp("com.faendir.kotlin.autodsl:processor:$autoDslVersion")
}

1.b) Add dependencies (KAPT):

build.gradle.kts:

plugins {
kotlin("kapt") version "1.5.0"
}
repositories {
mavenCentral()
google()
}
dependencies {
val autoDslVersion ="<latest version>"//check https://github.com/F43nd1r/autodsl/releases
implementation("com.faendir.kotlin.autodsl:annotations:$autoDslVersion")
kapt("com.faendir.kotlin.autodsl:processor:$autoDslVersion")
}
  1. Add @AutoDsl to your classes and build your project

  2. Enjoy your new DSL!

About

Auto-generate DSLs for Kotlin using annotations

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

AutoDSL for Kotlin

Auto-generates DSL (Domain Specific Language) for your Kotlin projects using annotations.

Inspired by AutoDsl, which is no longer maintained.

Documentation

For a concise feature guide, see Features.

Create expressive, immutable and type-safe DSL without boilerplate code:

person {
name ="Juan"
age =34
address {
street ="200 Celebration Bv"
zipCode =34747
location {
lat =100.0
lng =100.0
}
}
friend {
name ="Arturo"
age =28
}
friend {
name ="Tiwa"
age =30
}
}

To generate the previous DSL you just need to provide your desired classes with @AutoDsl:

@AutoDsl
classPerson(
valname:String,
valage:Int,
valaddress:Address?,
valfriends:List<Person> = emptyList(),
//in some cases you'll need to provide a valid singular form manually
@AutoDslSingular("clazz")
valclasses:List<Person> = emptyList()
)
@AutoDsl
data classAddress(
valstreet:String,
valzipCode:Int,
vallocation:Location?
)
@AutoDsl
classLocation {
val lat:Doubleval lng:Doubleconstructor() {
lat =0.0
lng =0.0
}
// with multiple constructors you can specify which one to use.
@AutoDslConstructor
constructor(lat:Double, lng:Double) {
this.lat = lat
this.lng = lng
}
}

AutoDsl will be generating a builder class and extension function for the annotated class providing this super expressive DSL.

For required parameters like name the DSL will throw an exception at runtime. To make it optional just set the property as nullable with the question mark like address, or provide a default value like friends. The value will be null in case it's not set.

For inspections on required parameters use this IntelliJ plugin.

Default values are supported!

Usage

You can use either ksp or kapt to run this processor. See here for a comparison of ksp and kapt.

1.a) Add dependencies (Kotlin Symbol Processing (KSP)):

settings.gradle.kts:

pluginManagement {
repositories {
gradlePluginPortal()
google() //required for ksp
}
}

build.gradle.kts:

plugins {
id("com.google.devtools.ksp") version "<latest ksp version>"//check https://github.com/google/ksp/releases
}
repositories {
mavenCentral()
google()
}
dependencies {
val autoDslVersion ="<latest version>"//check https://github.com/F43nd1r/autodsl-ksp/releases
implementation("com.faendir.kotlin.autodsl:annotations:$autoDslVersion")
ksp("com.faendir.kotlin.autodsl:processor:$autoDslVersion")
}

1.b) Add dependencies (KAPT):

build.gradle.kts:

plugins {
kotlin("kapt") version "1.5.0"
}
repositories {
mavenCentral()
google()
}
dependencies {
val autoDslVersion ="<latest version>"//check https://github.com/F43nd1r/autodsl/releases
implementation("com.faendir.kotlin.autodsl:annotations:$autoDslVersion")
kapt("com.faendir.kotlin.autodsl:processor:$autoDslVersion")
}
  1. Add @AutoDsl to your classes and build your project

  2. Enjoy your new DSL!

About

Auto-generate DSLs for Kotlin using annotations

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

AutoDSL for Kotlin

Auto-generates DSL (Domain Specific Language) for your Kotlin projects using annotations.

Inspired by AutoDsl, which is no longer maintained.

Documentation

For a concise feature guide, see Features.

Create expressive, immutable and type-safe DSL without boilerplate code:

person {
name ="Juan"
age =34
address {
street ="200 Celebration Bv"
zipCode =34747
location {
lat =100.0
lng =100.0
}
}
friend {
name ="Arturo"
age =28
}
friend {
name ="Tiwa"
age =30
}
}

To generate the previous DSL you just need to provide your desired classes with @AutoDsl:

@AutoDsl
classPerson(
valname:String,
valage:Int,
valaddress:Address?,
valfriends:List<Person> = emptyList(),
//in some cases you'll need to provide a valid singular form manually
@AutoDslSingular("clazz")
valclasses:List<Person> = emptyList()
)
@AutoDsl
data classAddress(
valstreet:String,
valzipCode:Int,
vallocation:Location?
)
@AutoDsl
classLocation {
val lat:Doubleval lng:Doubleconstructor() {
lat =0.0
lng =0.0
}
// with multiple constructors you can specify which one to use.
@AutoDslConstructor
constructor(lat:Double, lng:Double) {
this.lat = lat
this.lng = lng
}
}

AutoDsl will be generating a builder class and extension function for the annotated class providing this super expressive DSL.

For required parameters like name the DSL will throw an exception at runtime. To make it optional just set the property as nullable with the question mark like address, or provide a default value like friends. The value will be null in case it's not set.

For inspections on required parameters use this IntelliJ plugin.

Default values are supported!

Usage

You can use either ksp or kapt to run this processor. See here for a comparison of ksp and kapt.

1.a) Add dependencies (Kotlin Symbol Processing (KSP)):

settings.gradle.kts:

pluginManagement {
repositories {
gradlePluginPortal()
google() //required for ksp
}
}

build.gradle.kts:

plugins {
id("com.google.devtools.ksp") version "<latest ksp version>"//check https://github.com/google/ksp/releases
}
repositories {
mavenCentral()
google()
}
dependencies {
val autoDslVersion ="<latest version>"//check https://github.com/F43nd1r/autodsl-ksp/releases
implementation("com.faendir.kotlin.autodsl:annotations:$autoDslVersion")
ksp("com.faendir.kotlin.autodsl:processor:$autoDslVersion")
}

1.b) Add dependencies (KAPT):

build.gradle.kts:

plugins {
kotlin("kapt") version "1.5.0"
}
repositories {
mavenCentral()
google()
}
dependencies {
val autoDslVersion ="<latest version>"//check https://github.com/F43nd1r/autodsl/releases
implementation("com.faendir.kotlin.autodsl:annotations:$autoDslVersion")
kapt("com.faendir.kotlin.autodsl:processor:$autoDslVersion")
}
  1. Add @AutoDsl to your classes and build your project

  2. Enjoy your new DSL!

About

Auto-generate DSLs for Kotlin using annotations

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

AutoDSL for Kotlin

Auto-generates DSL (Domain Specific Language) for your Kotlin projects using annotations.

Inspired by AutoDsl, which is no longer maintained.

Documentation

For a concise feature guide, see Features.

Create expressive, immutable and type-safe DSL without boilerplate code:

person {
name ="Juan"
age =34
address {
street ="200 Celebration Bv"
zipCode =34747
location {
lat =100.0
lng =100.0
}
}
friend {
name ="Arturo"
age =28
}
friend {
name ="Tiwa"
age =30
}
}

To generate the previous DSL you just need to provide your desired classes with @AutoDsl:

@AutoDsl
classPerson(
valname:String,
valage:Int,
valaddress:Address?,
valfriends:List<Person> = emptyList(),
//in some cases you'll need to provide a valid singular form manually
@AutoDslSingular("clazz")
valclasses:List<Person> = emptyList()
)
@AutoDsl
data classAddress(
valstreet:String,
valzipCode:Int,
vallocation:Location?
)
@AutoDsl
classLocation {
val lat:Doubleval lng:Doubleconstructor() {
lat =0.0
lng =0.0
}
// with multiple constructors you can specify which one to use.
@AutoDslConstructor
constructor(lat:Double, lng:Double) {
this.lat = lat
this.lng = lng
}
}

AutoDsl will be generating a builder class and extension function for the annotated class providing this super expressive DSL.

For required parameters like name the DSL will throw an exception at runtime. To make it optional just set the property as nullable with the question mark like address, or provide a default value like friends. The value will be null in case it's not set.

For inspections on required parameters use this IntelliJ plugin.

Default values are supported!

Usage

You can use either ksp or kapt to run this processor. See here for a comparison of ksp and kapt.

1.a) Add dependencies (Kotlin Symbol Processing (KSP)):

settings.gradle.kts:

pluginManagement {
repositories {
gradlePluginPortal()
google() //required for ksp
}
}

build.gradle.kts:

plugins {
id("com.google.devtools.ksp") version "<latest ksp version>"//check https://github.com/google/ksp/releases
}
repositories {
mavenCentral()
google()
}
dependencies {
val autoDslVersion ="<latest version>"//check https://github.com/F43nd1r/autodsl-ksp/releases
implementation("com.faendir.kotlin.autodsl:annotations:$autoDslVersion")
ksp("com.faendir.kotlin.autodsl:processor:$autoDslVersion")
}

1.b) Add dependencies (KAPT):

build.gradle.kts:

plugins {
kotlin("kapt") version "1.5.0"
}
repositories {
mavenCentral()
google()
}
dependencies {
val autoDslVersion ="<latest version>"//check https://github.com/F43nd1r/autodsl/releases
implementation("com.faendir.kotlin.autodsl:annotations:$autoDslVersion")
kapt("com.faendir.kotlin.autodsl:processor:$autoDslVersion")
}
  1. Add @AutoDsl to your classes and build your project

  2. Enjoy your new DSL!

About

Auto-generate DSLs for Kotlin using annotations

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

AutoDSL for Kotlin

Auto-generates DSL (Domain Specific Language) for your Kotlin projects using annotations.

Inspired by AutoDsl, which is no longer maintained.

Documentation

For a concise feature guide, see Features.

Create expressive, immutable and type-safe DSL without boilerplate code:

person {
name ="Juan"
age =34
address {
street ="200 Celebration Bv"
zipCode =34747
location {
lat =100.0
lng =100.0
}
}
friend {
name ="Arturo"
age =28
}
friend {
name ="Tiwa"
age =30
}
}

To generate the previous DSL you just need to provide your desired classes with @AutoDsl:

@AutoDsl
classPerson(
valname:String,
valage:Int,
valaddress:Address?,
valfriends:List<Person> = emptyList(),
//in some cases you'll need to provide a valid singular form manually
@AutoDslSingular("clazz")
valclasses:List<Person> = emptyList()
)
@AutoDsl
data classAddress(
valstreet:String,
valzipCode:Int,
vallocation:Location?
)
@AutoDsl
classLocation {
val lat:Doubleval lng:Doubleconstructor() {
lat =0.0
lng =0.0
}
// with multiple constructors you can specify which one to use.
@AutoDslConstructor
constructor(lat:Double, lng:Double) {
this.lat = lat
this.lng = lng
}
}

AutoDsl will be generating a builder class and extension function for the annotated class providing this super expressive DSL.

For required parameters like name the DSL will throw an exception at runtime. To make it optional just set the property as nullable with the question mark like address, or provide a default value like friends. The value will be null in case it's not set.

For inspections on required parameters use this IntelliJ plugin.

Default values are supported!

Usage

You can use either ksp or kapt to run this processor. See here for a comparison of ksp and kapt.

1.a) Add dependencies (Kotlin Symbol Processing (KSP)):

settings.gradle.kts:

pluginManagement {
repositories {
gradlePluginPortal()
google() //required for ksp
}
}

build.gradle.kts:

plugins {
id("com.google.devtools.ksp") version "<latest ksp version>"//check https://github.com/google/ksp/releases
}
repositories {
mavenCentral()
google()
}
dependencies {
val autoDslVersion ="<latest version>"//check https://github.com/F43nd1r/autodsl-ksp/releases
implementation("com.faendir.kotlin.autodsl:annotations:$autoDslVersion")
ksp("com.faendir.kotlin.autodsl:processor:$autoDslVersion")
}

1.b) Add dependencies (KAPT):

build.gradle.kts:

plugins {
kotlin("kapt") version "1.5.0"
}
repositories {
mavenCentral()
google()
}
dependencies {
val autoDslVersion ="<latest version>"//check https://github.com/F43nd1r/autodsl/releases
implementation("com.faendir.kotlin.autodsl:annotations:$autoDslVersion")
kapt("com.faendir.kotlin.autodsl:processor:$autoDslVersion")
}
  1. Add @AutoDsl to your classes and build your project

  2. Enjoy your new DSL!

About

Auto-generate DSLs for Kotlin using annotations

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

AutoDSL for Kotlin

Auto-generates DSL (Domain Specific Language) for your Kotlin projects using annotations.

Inspired by AutoDsl, which is no longer maintained.

Documentation

For a concise feature guide, see Features.

Create expressive, immutable and type-safe DSL without boilerplate code:

person {
name ="Juan"
age =34
address {
street ="200 Celebration Bv"
zipCode =34747
location {
lat =100.0
lng =100.0
}
}
friend {
name ="Arturo"
age =28
}
friend {
name ="Tiwa"
age =30
}
}

To generate the previous DSL you just need to provide your desired classes with @AutoDsl:

@AutoDsl
classPerson(
valname:String,
valage:Int,
valaddress:Address?,
valfriends:List<Person> = emptyList(),
//in some cases you'll need to provide a valid singular form manually
@AutoDslSingular("clazz")
valclasses:List<Person> = emptyList()
)
@AutoDsl
data classAddress(
valstreet:String,
valzipCode:Int,
vallocation:Location?
)
@AutoDsl
classLocation {
val lat:Doubleval lng:Doubleconstructor() {
lat =0.0
lng =0.0
}
// with multiple constructors you can specify which one to use.
@AutoDslConstructor
constructor(lat:Double, lng:Double) {
this.lat = lat
this.lng = lng
}
}

AutoDsl will be generating a builder class and extension function for the annotated class providing this super expressive DSL.

For required parameters like name the DSL will throw an exception at runtime. To make it optional just set the property as nullable with the question mark like address, or provide a default value like friends. The value will be null in case it's not set.

For inspections on required parameters use this IntelliJ plugin.

Default values are supported!

Usage

You can use either ksp or kapt to run this processor. See here for a comparison of ksp and kapt.

1.a) Add dependencies (Kotlin Symbol Processing (KSP)):

settings.gradle.kts:

pluginManagement {
repositories {
gradlePluginPortal()
google() //required for ksp
}
}

build.gradle.kts:

plugins {
id("com.google.devtools.ksp") version "<latest ksp version>"//check https://github.com/google/ksp/releases
}
repositories {
mavenCentral()
google()
}
dependencies {
val autoDslVersion ="<latest version>"//check https://github.com/F43nd1r/autodsl-ksp/releases
implementation("com.faendir.kotlin.autodsl:annotations:$autoDslVersion")
ksp("com.faendir.kotlin.autodsl:processor:$autoDslVersion")
}

1.b) Add dependencies (KAPT):

build.gradle.kts:

plugins {
kotlin("kapt") version "1.5.0"
}
repositories {
mavenCentral()
google()
}
dependencies {
val autoDslVersion ="<latest version>"//check https://github.com/F43nd1r/autodsl/releases
implementation("com.faendir.kotlin.autodsl:annotations:$autoDslVersion")
kapt("com.faendir.kotlin.autodsl:processor:$autoDslVersion")
}
  1. Add @AutoDsl to your classes and build your project

  2. Enjoy your new DSL!

About

Auto-generate DSLs for Kotlin using annotations

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

AutoDSL for Kotlin

Auto-generates DSL (Domain Specific Language) for your Kotlin projects using annotations.

Inspired by AutoDsl, which is no longer maintained.

Documentation

For a concise feature guide, see Features.

Create expressive, immutable and type-safe DSL without boilerplate code:

person {
name ="Juan"
age =34
address {
street ="200 Celebration Bv"
zipCode =34747
location {
lat =100.0
lng =100.0
}
}
friend {
name ="Arturo"
age =28
}
friend {
name ="Tiwa"
age =30
}
}

To generate the previous DSL you just need to provide your desired classes with @AutoDsl:

@AutoDsl
classPerson(
valname:String,
valage:Int,
valaddress:Address?,
valfriends:List<Person> = emptyList(),
//in some cases you'll need to provide a valid singular form manually
@AutoDslSingular("clazz")
valclasses:List<Person> = emptyList()
)
@AutoDsl
data classAddress(
valstreet:String,
valzipCode:Int,
vallocation:Location?
)
@AutoDsl
classLocation {
val lat:Doubleval lng:Doubleconstructor() {
lat =0.0
lng =0.0
}
// with multiple constructors you can specify which one to use.
@AutoDslConstructor
constructor(lat:Double, lng:Double) {
this.lat = lat
this.lng = lng
}
}

AutoDsl will be generating a builder class and extension function for the annotated class providing this super expressive DSL.

For required parameters like name the DSL will throw an exception at runtime. To make it optional just set the property as nullable with the question mark like address, or provide a default value like friends. The value will be null in case it's not set.

For inspections on required parameters use this IntelliJ plugin.

Default values are supported!

Usage

You can use either ksp or kapt to run this processor. See here for a comparison of ksp and kapt.

1.a) Add dependencies (Kotlin Symbol Processing (KSP)):

settings.gradle.kts:

pluginManagement {
repositories {
gradlePluginPortal()
google() //required for ksp
}
}

build.gradle.kts:

plugins {
id("com.google.devtools.ksp") version "<latest ksp version>"//check https://github.com/google/ksp/releases
}
repositories {
mavenCentral()
google()
}
dependencies {
val autoDslVersion ="<latest version>"//check https://github.com/F43nd1r/autodsl-ksp/releases
implementation("com.faendir.kotlin.autodsl:annotations:$autoDslVersion")
ksp("com.faendir.kotlin.autodsl:processor:$autoDslVersion")
}

1.b) Add dependencies (KAPT):

build.gradle.kts:

plugins {
kotlin("kapt") version "1.5.0"
}
repositories {
mavenCentral()
google()
}
dependencies {
val autoDslVersion ="<latest version>"//check https://github.com/F43nd1r/autodsl/releases
implementation("com.faendir.kotlin.autodsl:annotations:$autoDslVersion")
kapt("com.faendir.kotlin.autodsl:processor:$autoDslVersion")
}
  1. Add @AutoDsl to your classes and build your project

  2. Enjoy your new DSL!

About

Auto-generate DSLs for Kotlin using annotations

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

AutoDSL for Kotlin

Auto-generates DSL (Domain Specific Language) for your Kotlin projects using annotations.

Inspired by AutoDsl, which is no longer maintained.

Documentation

For a concise feature guide, see Features.

Create expressive, immutable and type-safe DSL without boilerplate code:

person {
name ="Juan"
age =34
address {
street ="200 Celebration Bv"
zipCode =34747
location {
lat =100.0
lng =100.0
}
}
friend {
name ="Arturo"
age =28
}
friend {
name ="Tiwa"
age =30
}
}

To generate the previous DSL you just need to provide your desired classes with @AutoDsl:

@AutoDsl
classPerson(
valname:String,
valage:Int,
valaddress:Address?,
valfriends:List<Person> = emptyList(),
//in some cases you'll need to provide a valid singular form manually
@AutoDslSingular("clazz")
valclasses:List<Person> = emptyList()
)
@AutoDsl
data classAddress(
valstreet:String,
valzipCode:Int,
vallocation:Location?
)
@AutoDsl
classLocation {
val lat:Doubleval lng:Doubleconstructor() {
lat =0.0
lng =0.0
}
// with multiple constructors you can specify which one to use.
@AutoDslConstructor
constructor(lat:Double, lng:Double) {
this.lat = lat
this.lng = lng
}
}

AutoDsl will be generating a builder class and extension function for the annotated class providing this super expressive DSL.

For required parameters like name the DSL will throw an exception at runtime. To make it optional just set the property as nullable with the question mark like address, or provide a default value like friends. The value will be null in case it's not set.

For inspections on required parameters use this IntelliJ plugin.

Default values are supported!

Usage

You can use either ksp or kapt to run this processor. See here for a comparison of ksp and kapt.

1.a) Add dependencies (Kotlin Symbol Processing (KSP)):

settings.gradle.kts:

pluginManagement {
repositories {
gradlePluginPortal()
google() //required for ksp
}
}

build.gradle.kts:

plugins {
id("com.google.devtools.ksp") version "<latest ksp version>"//check https://github.com/google/ksp/releases
}
repositories {
mavenCentral()
google()
}
dependencies {
val autoDslVersion ="<latest version>"//check https://github.com/F43nd1r/autodsl-ksp/releases
implementation("com.faendir.kotlin.autodsl:annotations:$autoDslVersion")
ksp("com.faendir.kotlin.autodsl:processor:$autoDslVersion")
}

1.b) Add dependencies (KAPT):

build.gradle.kts:

plugins {
kotlin("kapt") version "1.5.0"
}
repositories {
mavenCentral()
google()
}
dependencies {
val autoDslVersion ="<latest version>"//check https://github.com/F43nd1r/autodsl/releases
implementation("com.faendir.kotlin.autodsl:annotations:$autoDslVersion")
kapt("com.faendir.kotlin.autodsl:processor:$autoDslVersion")
}
  1. Add @AutoDsl to your classes and build your project

  2. Enjoy your new DSL!

About

Auto-generate DSLs for Kotlin using annotations

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages