85 lines
3.5 KiB
Kotlin
85 lines
3.5 KiB
Kotlin
/*
|
|
* The MIT License (MIT)
|
|
*
|
|
* Copyright (c) 2017 Minecrell <https://github.com/Minecrell>
|
|
*
|
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
* of this software and associated documentation files (the "Software"), to deal
|
|
* in the Software without restriction, including without limitation the rights
|
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
* copies of the Software, and to permit persons to whom the Software is
|
|
* furnished to do so, subject to the following conditions:
|
|
*
|
|
* The above copyright notice and this permission notice shall be included in
|
|
* all copies or substantial portions of the Software.
|
|
*
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
* THE SOFTWARE.
|
|
*/
|
|
|
|
package net.minecrell.pluginyml
|
|
|
|
import com.fasterxml.jackson.annotation.JsonInclude
|
|
import com.fasterxml.jackson.databind.ObjectMapper
|
|
import com.fasterxml.jackson.databind.module.SimpleModule
|
|
import com.fasterxml.jackson.databind.ser.std.StdDelegatingSerializer
|
|
import com.fasterxml.jackson.databind.util.Converter
|
|
import com.fasterxml.jackson.databind.util.StdConverter
|
|
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory
|
|
import com.fasterxml.jackson.dataformat.yaml.YAMLGenerator
|
|
import com.fasterxml.jackson.module.kotlin.registerKotlinModule
|
|
import org.gradle.api.DefaultTask
|
|
import org.gradle.api.NamedDomainObjectCollection
|
|
import org.gradle.api.file.DirectoryProperty
|
|
import org.gradle.api.provider.Property
|
|
import org.gradle.api.tasks.Input
|
|
import org.gradle.api.tasks.Nested
|
|
import org.gradle.api.tasks.OutputDirectory
|
|
import org.gradle.api.tasks.TaskAction
|
|
import org.gradle.kotlin.dsl.property
|
|
|
|
open class GeneratePluginDescription : DefaultTask() {
|
|
|
|
@Input
|
|
val fileName: Property<String> = project.objects.property()
|
|
|
|
@Nested
|
|
val pluginDescription: Property<PluginDescription> = project.objects.property()
|
|
|
|
@OutputDirectory
|
|
val outputDirectory: DirectoryProperty = project.objects.directoryProperty()
|
|
|
|
@TaskAction
|
|
fun generate() {
|
|
val factory = YAMLFactory()
|
|
.disable(YAMLGenerator.Feature.WRITE_DOC_START_MARKER)
|
|
.enable(YAMLGenerator.Feature.MINIMIZE_QUOTES)
|
|
.enable(YAMLGenerator.Feature.INDENT_ARRAYS)
|
|
|
|
val module = SimpleModule()
|
|
@Suppress("UNCHECKED_CAST") // Too stupid to figure out the generics here...
|
|
module.addSerializer(StdDelegatingSerializer(NamedDomainObjectCollection::class.java,
|
|
NamedDomainObjectCollectionConverter as Converter<NamedDomainObjectCollection<*>, *>))
|
|
|
|
val mapper = ObjectMapper(factory)
|
|
.registerKotlinModule()
|
|
.registerModule(module)
|
|
.setSerializationInclusion(JsonInclude.Include.NON_EMPTY)
|
|
|
|
mapper.writeValue(outputDirectory.file(fileName).get().asFile, pluginDescription.get())
|
|
}
|
|
|
|
object NamedDomainObjectCollectionConverter : StdConverter<NamedDomainObjectCollection<Any>, Map<String, Any>>() {
|
|
override fun convert(value: NamedDomainObjectCollection<Any>): Map<String, Any> {
|
|
val namer = value.namer
|
|
return value.associateBy { namer.determineName(it) }
|
|
}
|
|
}
|
|
|
|
}
|