From a5d5562d936047124f77f08a96787f26a5532351 Mon Sep 17 00:00:00 2001 From: LordMZTE Date: Sat, 15 Aug 2020 20:49:29 +0200 Subject: [PATCH] improve docs remove mergeTo function due to stdlib containing alternative getModMetas now takes predicate --- .../kotlin/ley/anvil/modpacktools/Main.kt | 4 +- .../modpacktools/command/AbstractCommand.kt | 13 +++-- .../modpacktools/command/CommandLoader.kt | 21 ++++---- .../modpacktools/command/CommandReturn.kt | 10 ++-- .../anvil/modpacktools/command/ICommand.kt | 9 +++- .../anvil/modpacktools/command/LoadCommand.kt | 2 +- .../modpacktools/commands/CreateModlist.kt | 8 +-- .../modpacktools/commands/DownloadMods.kt | 2 +- .../ley/anvil/modpacktools/commands/Import.kt | 2 +- .../modpacktools/commands/ListRelations.kt | 5 +- .../ley/anvil/modpacktools/util/CLIUtil.kt | 21 ++++---- .../anvil/modpacktools/util/FileDownloader.kt | 12 ++--- .../modpacktools/util/ModpackJsonHandler.kt | 37 ++++++++----- .../ley/anvil/modpacktools/util/Util.kt | 52 ++++++++----------- .../modpacktools/util/addonscript/ASUtil.kt | 21 +++++++- .../anvil/modpacktools/util/config/Config.kt | 6 +-- .../modpacktools/util/config/ConfigToml.kt | 12 ++--- 17 files changed, 132 insertions(+), 105 deletions(-) diff --git a/src/main/kotlin/ley/anvil/modpacktools/Main.kt b/src/main/kotlin/ley/anvil/modpacktools/Main.kt index ad5a486..e799673 100644 --- a/src/main/kotlin/ley/anvil/modpacktools/Main.kt +++ b/src/main/kotlin/ley/anvil/modpacktools/Main.kt @@ -19,13 +19,11 @@ import java.util.NoSuchElementException import java.util.concurrent.Executors import java.util.concurrent.TimeUnit.MICROSECONDS -//Lazy initialization will prevent objects from being initilized if not needed +//Lazy initialization will prevent objects from being initialized if not needed val CONFIG by lazy {Config("modpacktoolsconfig.toml")} val LOADER by lazy {CommandLoader("ley.anvil.modpacktools.commands")} val MPJH by lazy {ModpackJsonHandler(File(CONFIG.config.pathOrException("Locations/src"), "modpack.json"))} val GSON: Gson by lazy {GsonBuilder().setPrettyPrinting().create()} - -//TODO thinks term has no color support on win with edited registry. probably no big deal val TERMC by lazy {TermColors()} //for checking if the client has been initialized when closing it diff --git a/src/main/kotlin/ley/anvil/modpacktools/command/AbstractCommand.kt b/src/main/kotlin/ley/anvil/modpacktools/command/AbstractCommand.kt index 63ff48f..5523faa 100644 --- a/src/main/kotlin/ley/anvil/modpacktools/command/AbstractCommand.kt +++ b/src/main/kotlin/ley/anvil/modpacktools/command/AbstractCommand.kt @@ -4,10 +4,15 @@ import net.sourceforge.argparse4j.ArgumentParsers import net.sourceforge.argparse4j.inf.ArgumentParser /** - * Implement this for commands. it is meant to reduce boilerplate. + * an implementation of [ICommand] meant to reduce boilerplate. + * this automatically creates a base [ArgumentParser] + * with the [helpMessage] as description and then applies [addArgs] to it + * and uses [displayName] as the name for the command in the help message. + * + * the [name] of the command will be a converted version of the [displayName] by default * * @param displayName the name of this command to be displayed in the help message - * @param name the internal name of the command. will be the display name in lower case and with _ instead of spaces by default + * @param name the internal name of the command. will be the [displayName] lower case and with _ instead of spaces by default */ abstract class AbstractCommand @@ -24,10 +29,10 @@ constructor( } /** - * This will be called to add arguments to the arg parser of this command. + * This will be called to add arguments to the [ArgumentParser] of this command. * override this to add arguments. * - * @receiver the parser to add the args to + * @receiver the [ArgumentParser] to add the args to */ protected open fun ArgumentParser.addArgs() {} } diff --git a/src/main/kotlin/ley/anvil/modpacktools/command/CommandLoader.kt b/src/main/kotlin/ley/anvil/modpacktools/command/CommandLoader.kt index e580ec4..d5c9f68 100644 --- a/src/main/kotlin/ley/anvil/modpacktools/command/CommandLoader.kt +++ b/src/main/kotlin/ley/anvil/modpacktools/command/CommandLoader.kt @@ -7,9 +7,10 @@ import org.reflections.Reflections import org.reflections.scanners.SubTypesScanner import kotlin.reflect.KClass import kotlin.reflect.full.createInstance +import kotlin.reflect.full.hasAnnotation /** - * The command loader will scan the given package for {@link ICommand} classes and add them to the command list + * The command loader will scan the given package for [ICommand] classes and add them to the command list * * @param pkg The package to scan for commands */ @@ -21,7 +22,9 @@ class CommandLoader(private val pkg: String) { companion object { /** - * Runs a command statically. + * Parses arguments for a given [ICommand] and executes it. + * Also checks if the [ICommand] has [ICommand.needsConfig] or [ICommand.needsModpackjson] set + * and throws an exception throws an exception if invalid * * @param args the args to pass to the command * @throws ConfigMissingException if the command requires a config and it is not found @@ -53,24 +56,23 @@ class CommandLoader(private val pkg: String) { refs.getSubTypesOf(ICommand::class.java).stream() .map {it.kotlin} //Only annotated classes - //Cannot use it.hasAnnotation because it is experimental and requires everything to be annotated so this makes more sense - .filter {it.annotations.any {ann -> ann.annotationClass == LoadCommand::class}} - //can be object + .filter {it.hasAnnotation()} + //can be object, if so use that instead of new instance .map {it.objectInstance ?: it} //create new instance if it is a class, otherwise just add the current instance .forEach {if(it is ICommand) addCommand(it) else addClass(it as KClass)} } /** - * Creates a new instance of the given class and adds it to the command list + * Creates a new instance of the given [KClass] and adds it to the command list * - * @param clazz the class to add + * @param clazz the [KClass] to add * @return if it was successful */ fun addClass(clazz: KClass) = addCommand(clazz.createInstance()) /** - * Adds a command to the command list with the name that getName() returns + * Adds a command to the command list with the name that [ICommand.name] returns * * @param command the command to add * @return if it was successful @@ -83,7 +85,8 @@ class CommandLoader(private val pkg: String) { } /** - * Runs the given command + * Runs an [ICommand] that has been loaded by this [CommandLoader] + * given a name. * * @param name the name of the command to be run * @param args the arguments passed into the command diff --git a/src/main/kotlin/ley/anvil/modpacktools/command/CommandReturn.kt b/src/main/kotlin/ley/anvil/modpacktools/command/CommandReturn.kt index 81952f0..ed067f9 100644 --- a/src/main/kotlin/ley/anvil/modpacktools/command/CommandReturn.kt +++ b/src/main/kotlin/ley/anvil/modpacktools/command/CommandReturn.kt @@ -1,22 +1,22 @@ package ley.anvil.modpacktools.command -data class CommandReturn private constructor(val ret: String?, val success: Boolean) { +data class CommandReturn constructor(val ret: String?, val success: Boolean) { companion object { /** - * Get a failed {@link CommandReturn}. This should be used if something went wrong + * Get a failed [CommandReturn]. This should be used if something went wrong * * @param ret the error message - * @return the {@link CommandReturn} + * @return the [CommandReturn] */ @JvmStatic @JvmOverloads fun fail(ret: String? = null) = CommandReturn(ret, false) /** - * Get a successful {@link CommandReturn} Without a message. Use this if the command was executed successfully + * Get a successful [CommandReturn]. Use this if the command was executed successfully * * @param ret a return message - * @return the {@link CommandReturn} + * @return the [CommandReturn] */ @JvmStatic @JvmOverloads diff --git a/src/main/kotlin/ley/anvil/modpacktools/command/ICommand.kt b/src/main/kotlin/ley/anvil/modpacktools/command/ICommand.kt index 3d1fb74..0f780f4 100644 --- a/src/main/kotlin/ley/anvil/modpacktools/command/ICommand.kt +++ b/src/main/kotlin/ley/anvil/modpacktools/command/ICommand.kt @@ -15,10 +15,14 @@ interface ICommand { */ fun execute(args: Namespace): CommandReturn + /** + * The [ArgumentParser] which will be used to parse the arguments for this command by the [CommandLoader] + */ val parser: ArgumentParser /** * this is the name of the command + * should be lower case and separated by _ */ val name: String @@ -29,13 +33,14 @@ interface ICommand { get() = "" /** - * If this command needs the config file to be present. the command will not run if this returns true and there is no config file + * If this command needs the config file to be present. + * the command should not run if this returns true and there is no config file */ val needsConfig: Boolean get() = true /** - * If this returns true, the command will not run if the modpackjson file doesnt exist + * If this returns true, the command should not run if the modpackjson file doesn't exist */ val needsModpackjson: Boolean get() = true diff --git a/src/main/kotlin/ley/anvil/modpacktools/command/LoadCommand.kt b/src/main/kotlin/ley/anvil/modpacktools/command/LoadCommand.kt index 33a64a1..fba4e9f 100644 --- a/src/main/kotlin/ley/anvil/modpacktools/command/LoadCommand.kt +++ b/src/main/kotlin/ley/anvil/modpacktools/command/LoadCommand.kt @@ -1,7 +1,7 @@ package ley.anvil.modpacktools.command /** - * Tells The {@link CommandLoader} to load this command + * Tells The [CommandLoader] to load this [ICommand] */ @Target(AnnotationTarget.CLASS) @Retention(AnnotationRetention.RUNTIME) diff --git a/src/main/kotlin/ley/anvil/modpacktools/commands/CreateModlist.kt b/src/main/kotlin/ley/anvil/modpacktools/commands/CreateModlist.kt index c9c3667..6df45b6 100644 --- a/src/main/kotlin/ley/anvil/modpacktools/commands/CreateModlist.kt +++ b/src/main/kotlin/ley/anvil/modpacktools/commands/CreateModlist.kt @@ -69,9 +69,9 @@ object CreateModlist : AbstractCommand("CreateModlist") { val all = args.getBoolean("all") val sorting: Comparator = when(args.get("sorting")!!) { - Sorting.NAME -> comparing {it.name} - Sorting.DESCRIPTION -> comparing {it.description?.getOrNull(0) ?: ""} - Sorting.AUTHOR -> comparing {it.contributors.keys.first()} + Sorting.NAME -> comparing {it.name ?: ""} + Sorting.DESCRIPTION -> comparing {it.description?.getOrNull(0) ?: ""} + Sorting.AUTHOR -> comparing {it.contributors.keys.first()} } return when(args.get("type")!!) { @@ -169,7 +169,7 @@ object CreateModlist : AbstractCommand("CreateModlist") { } private fun getMods(all: Boolean, sorting: Comparator): List = - MPJH.getModMetas(if(all) null else arrayOf("mod")).sortedWith(sorting) + MPJH.getModMetas {all || "mod" == it.type}.sortedWith(sorting) enum class Format { HTML, CSV diff --git a/src/main/kotlin/ley/anvil/modpacktools/commands/DownloadMods.kt b/src/main/kotlin/ley/anvil/modpacktools/commands/DownloadMods.kt index 2bd7703..e71b54e 100644 --- a/src/main/kotlin/ley/anvil/modpacktools/commands/DownloadMods.kt +++ b/src/main/kotlin/ley/anvil/modpacktools/commands/DownloadMods.kt @@ -57,7 +57,7 @@ object DownloadMods : AbstractCommand("DownloadMods") { if(args.getBoolean("all")) File(args.get("dir"), it.installer.split(':')[1]) else - args.get("dir"), + args.get("dir"), it.url, true, !args.getBoolean("force") diff --git a/src/main/kotlin/ley/anvil/modpacktools/commands/Import.kt b/src/main/kotlin/ley/anvil/modpacktools/commands/Import.kt index 384e7f2..4c1bb19 100644 --- a/src/main/kotlin/ley/anvil/modpacktools/commands/Import.kt +++ b/src/main/kotlin/ley/anvil/modpacktools/commands/Import.kt @@ -40,7 +40,7 @@ object Import : AbstractCommand("Import") { println("Converting...") MPJH.modpackJsonFile.parentFile.mkdirs() val mpjWriter = FileWriter(MPJH.modpackJsonFile) - GSON.fromJson(manifest.readAsJson(), ManifestJSON::class.java).toAS().write(mpjWriter) + GSON.fromJson(manifest.readAsJson(), ManifestJSON::class.java).toAS().write(mpjWriter) mpjWriter.close() return success("Converted sucessfully") } diff --git a/src/main/kotlin/ley/anvil/modpacktools/commands/ListRelations.kt b/src/main/kotlin/ley/anvil/modpacktools/commands/ListRelations.kt index edc0452..40d5b11 100644 --- a/src/main/kotlin/ley/anvil/modpacktools/commands/ListRelations.kt +++ b/src/main/kotlin/ley/anvil/modpacktools/commands/ListRelations.kt @@ -33,9 +33,8 @@ object ListRelations : AbstractCommand("ListRelations") { } override fun execute(args: Namespace): CommandReturn { - val metas = MPJH.getModMetas().sortedWith( - Comparator {a, b -> b.name?.let {a.name?.compareTo(it, true)} ?: 0} - ) + val metas = MPJH.getModMetas() + .sortedWith {a, b -> b.name?.let {a.name?.compareTo(it, true)} ?: 0} if(args.getBoolean("csv")) { metas.forEach { diff --git a/src/main/kotlin/ley/anvil/modpacktools/util/CLIUtil.kt b/src/main/kotlin/ley/anvil/modpacktools/util/CLIUtil.kt index 1aeac35..dedede7 100644 --- a/src/main/kotlin/ley/anvil/modpacktools/util/CLIUtil.kt +++ b/src/main/kotlin/ley/anvil/modpacktools/util/CLIUtil.kt @@ -5,37 +5,36 @@ package ley.anvil.modpacktools.util import java.io.PrintStream /** - * applies all given formatters to the string representation of the object and then prints it to stdout + * applies all given [formatters] to the [toString] representation of [x] and then prints it to [System.out] * * @param x the object to print - * @param formatters the formatters to apply to x, they will be ran in the order they are supplied in + * @param formatters the formatters to apply to [x]. they will be ran in the order they are supplied in */ fun fPrint(x: Any?, vararg formatters: (String) -> String) = System.out.fPrint(x, *formatters) /** - * applies all given formatters to the string representation of the object and then prints it + * applies all given [formatters] to the [toString] representation of [x] and then prints it * - * @receiver the printStream to print to + * @receiver the [PrintStream] to print to * @param x the object to print - * @param formatters the formatters to apply to x, they will be ran in the order they are supplied in + * @param formatters the formatters to apply to [x]. they will be ran in the order they are supplied in */ fun PrintStream.fPrint(x: Any?, vararg formatters: (String) -> String) = this.print(formatters.fold(x.toString()) {acc, f -> f(acc)}) /** - * applies all given formatters to the string representation of the object and then prints it with a newline at the end + * applies all given [formatters] to the [toString] representation of [x] and then prints it with a newline at the end * - * @receiver the printStream to print to + * @receiver the [PrintStream] to print to * @param x the object to print - * @param formatters the formatters to apply to x, they will be ran in the order they are supplied in + * @param formatters the formatters to apply to [x]. they will be ran in the order they are supplied in */ fun PrintStream.fPrintln(x: Any?, vararg formatters: (String) -> String) = this.fPrint(x, *formatters, {"$it\n"}) /** - * applies all given formatters to the string representation of the object and then prints it to stdout - * with a newline at the end + * applies all given [formatters] to the [toString] representation of [x] and then prints it to [System.out] with a newline at the end * * @param x the object to print - * @param formatters the formatters to apply to x, they will be ran in the order they are supplied in + * @param formatters the formatters to apply to [x]. they will be ran in the order they are supplied in */ fun fPrintln(x: Any?, vararg formatters: (String) -> String) = System.out.fPrintln(x, *formatters) diff --git a/src/main/kotlin/ley/anvil/modpacktools/util/FileDownloader.kt b/src/main/kotlin/ley/anvil/modpacktools/util/FileDownloader.kt index e9c4883..170b1fc 100644 --- a/src/main/kotlin/ley/anvil/modpacktools/util/FileDownloader.kt +++ b/src/main/kotlin/ley/anvil/modpacktools/util/FileDownloader.kt @@ -13,10 +13,10 @@ import java.nio.file.Paths import java.util.concurrent.CountDownLatch /** - * Downloads all supplied urls to the given files + * Downloads all supplied [files] * * @param files the files to download - * @param callback the callback which will be called once a download finishes + * @param callback the callback which will be called once a file in [files] finishes downloading */ fun downloadFiles( files: List, @@ -33,9 +33,9 @@ fun downloadFiles( /** * A file that should be downloaded * - * @param fileOrDir the file to save to - * @param url the url to download from - * @param shouldResolveFileName if true, the fileOrDir will be treated as directory and the file name will be resolved from the URL + * @param fileOrDir the [File] to save to + * @param url the [URL] to download from + * @param shouldResolveFileName if true, the [fileOrDir] will be treated as directory and the file name will be resolved from [url] */ data class FileToDownload( val fileOrDir: File, @@ -74,7 +74,7 @@ open class DownloadFileTask( var wasSkipped = true val outFile = if(file.shouldResolveFileName) - file.fileOrDir mergeTo Paths.get(response.request.url.toUri().path).fileName.toFile() + file.fileOrDir.resolve(Paths.get(response.request.url.toUri().path).fileName.toFile()) else file.fileOrDir diff --git a/src/main/kotlin/ley/anvil/modpacktools/util/ModpackJsonHandler.kt b/src/main/kotlin/ley/anvil/modpacktools/util/ModpackJsonHandler.kt index 7473c0d..aea3d32 100644 --- a/src/main/kotlin/ley/anvil/modpacktools/util/ModpackJsonHandler.kt +++ b/src/main/kotlin/ley/anvil/modpacktools/util/ModpackJsonHandler.kt @@ -8,11 +8,19 @@ import ley.anvil.modpacktools.MPJH import java.io.File import java.io.FileReader +/** + * This Class is responsible for reading and parsing the [modpackJsonFile] + * + * @param modpackJsonFile the file where modpack.json is located + */ class ModpackJsonHandler(val modpackJsonFile: File) { - //Null if no file exists + /** + * the [ASWrapper] for this [modpackJsonFile]. + * null if [modpackJsonFile] does not exist + */ val asWrapper: ASWrapper? get() { - return if (modpackJsonFile.exists()) { + return if(modpackJsonFile.exists()) { val reader = FileReader(modpackJsonFile) val ret = ASWrapper(AddonscriptJSON.read(reader, AddonscriptJSON::class.java)) reader.close() @@ -20,26 +28,27 @@ class ModpackJsonHandler(val modpackJsonFile: File) { } else null } - fun getModMetas(types: Array? = null): List { + /** + * returns all [MetaData]s from the [AddonscriptJSON.Relation]s in this [modpackJsonFile] + * + * @param shouldInclude a Predicate which is used to determine if + * a given [AddonscriptJSON.Relation] should be included in the list. + * will include all relations by default + * @return the list of [MetaData]s of relations in this [modpackJsonFile] + */ + @JvmOverloads + fun getModMetas(shouldInclude: (AddonscriptJSON.Relation) -> Boolean = {true}): List { val asJson = MPJH.asWrapper val mods = mutableListOf() val toGet = mutableListOf() - for ( - rel in asJson!!.defaultVersion.getRelations( - arrayOf("included"), /*TODO TILERA MAKE THIS NONSESE TAKE A PREDICATE AND NOT A LIST*/ - types - ) - ) { - if (rel.hasLocalMeta()) + for(rel in asJson!!.defaultVersion.getRelations(shouldInclude)) { + if(rel.hasLocalMeta()) mods.add(rel.localMeta) - else if (rel.hasFile() && rel.file.isArtifact) + else if(rel.hasFile() && rel.file.isArtifact) toGet.add(rel.file.artifact) } mods.addAll(ASWrapper.getMetaData(toGet.toTypedArray()).values) return mods } - - val json: AddonscriptJSON? - get() = asWrapper?.json } diff --git a/src/main/kotlin/ley/anvil/modpacktools/util/Util.kt b/src/main/kotlin/ley/anvil/modpacktools/util/Util.kt index 41d0771..c44ceb9 100644 --- a/src/main/kotlin/ley/anvil/modpacktools/util/Util.kt +++ b/src/main/kotlin/ley/anvil/modpacktools/util/Util.kt @@ -32,10 +32,10 @@ import kotlin.reflect.full.functions import kotlin.reflect.jvm.isAccessible /** - * Reads a Json File + * Reads a Json [File] * * @receiver the file to read from - * @return the file content as JsonObject + * @return the file content as [JsonObject] */ fun File.readAsJson(): JsonObject { require(this.exists()) {"File to read doesn't exist"} @@ -44,13 +44,13 @@ fun File.readAsJson(): JsonObject { } /** - * sends a http post request + * sends a HTTP POST request * - * @receiver the url to send the request to - * @param contentType what content type should be used. Example: {@code MediaType.parse("application/json; utf-8")} + * @receiver the [URL] to send the request to + * @param contentType what content type should be used. * @param payload the payload to send * @param additionalHeaders additional headers that should be added to the request - * @return the response as string + * @return the response */ @Throws(IOException::class) fun URL.httpPostStr(payload: String, contentType: MediaType? = null, additionalHeaders: Map? = null): Response = @@ -63,13 +63,13 @@ fun URL.httpPostStr(payload: String, contentType: MediaType? = null, additionalH ).execute() /** - * sends a http post request + * sends a HTTP POST request * - * @receiver the url to send the request to + * @receiver the [URL] to send the request to * @param contentType what content type should be used. Example: `"application/json; utf-8"` * @param payload the payload to send * @param additionalHeaders additional headers that should be added to the request - * @return the response as string + * @return the response */ @Throws(IOException::class) fun URL.httpPostStr(payload: String, contentType: String, additionalHeaders: Map? = null): Response { @@ -81,10 +81,10 @@ fun URL.httpPostStr(payload: String, contentType: String, additionalHeaders: Map } /** - * Sanitizes a URL to be valid by encoding illegal chars like spaces + * Sanitizes a [URL] to be valid by url-encoding illegal chars like spaces * - * @receiver the URL to sanitize - * @return the sanitized URL + * @receiver the [URL] to sanitize + * @return the sanitized [URL] */ fun URL.sanitize(): URL? = @@ -103,22 +103,13 @@ fun URL.sanitize(): URL? = } /** - * gets a function from the receiver and makes it accessible + * gets a [KFunction] from the receiver and makes it accessible * - * @param name the name of the function to get - * @receiver the class to get the function from + * @param name the name of the [KFunction] to get + * @receiver the [KClass] to get the [KFunction] from */ fun KClass<*>.getFun(name: String): KFunction<*>? = this.functions.find {it.name == name}?.apply {isAccessible = true} -/** - * merges 2 file's basically moving [other] into a directory represented by the receiver - * - * @receiver the parent directory - * @param other the file to put into [other] - * @return the combined file - */ -infix fun File.mergeTo(other: File): File = File(this.path, other.name) - /** * zips a directory. * @@ -150,9 +141,9 @@ fun Path.toZip(zStream: ZipOutputStream) { fun File.toZip(zStream: ZipOutputStream) = this.toPath().toZip(zStream) /** - * Unzips a zip file to a given directory + * Unzips a zip [File] to a given directory * - * @receiver the zip file to unzip + * @receiver the zip [File] to unzip * @param outputDir the dir to unzip to */ fun File.unzip(outputDir: File) { @@ -168,11 +159,12 @@ fun File.unzip(outputDir: File) { } /** - * this makes arguments for ArgumentParsers look cleaner + * this makes arguments for [ArgumentParser]s look cleaner * - * @receiver the parser to add the argument to - * @param names the names the argument will have - * @param block this will be called on the argument. it is for settings like help message + * @receiver the [ArgumentParser] to add the argument to + * @param names the names the [Argument] will have + * @param block this will be called on the [Argument]. + * it is for settings like help message */ fun ArgumentParser.arg(vararg names: String, block: Argument.() -> Unit) { addArgument(*names).block() diff --git a/src/main/kotlin/ley/anvil/modpacktools/util/addonscript/ASUtil.kt b/src/main/kotlin/ley/anvil/modpacktools/util/addonscript/ASUtil.kt index 833fc57..9347b73 100644 --- a/src/main/kotlin/ley/anvil/modpacktools/util/addonscript/ASUtil.kt +++ b/src/main/kotlin/ley/anvil/modpacktools/util/addonscript/ASUtil.kt @@ -2,15 +2,25 @@ package ley.anvil.modpacktools.util.addonscript import ley.anvil.modpacktools.TERMC import ley.anvil.modpacktools.util.fPrintln -import ley.anvil.modpacktools.util.mergeTo import org.apache.commons.io.FileUtils import java.io.File import java.io.PrintStream +/** + * This will be returned by [installFile] + * + * @param success if the file was installer successfully + * @param msg an optional message returned by [installFile] + */ data class InstallFileSuccess( val success: Boolean, val msg: String? = null ) { + /** + * Prints a message of this to the [out] [PrintStream] + * + * @param out the [PrintStream] to print the message to or [System.out] if not specified + */ @JvmOverloads fun printf(out: PrintStream = System.out) { if(msg != null) @@ -18,6 +28,13 @@ data class InstallFileSuccess( } } +/** + * This will install a file given an addonscript installer + * + * @param installer the installer to use + * @param file the file to install + * @param outDir the directory to install the [file] to + */ fun installFile(installer: String, file: File, outDir: File): InstallFileSuccess { when { installer == "internal.override" -> { @@ -38,7 +55,7 @@ fun installFile(installer: String, file: File, outDir: File): InstallFileSuccess installer.startsWith("internal.dir") -> { val (_, dir) = installer.split(":") - FileUtils.copyFile(file, File(outDir, dir) mergeTo file) + FileUtils.copyFile(file, File(outDir, dir).resolve(file)) } installer.startsWith("internal.zip") -> { diff --git a/src/main/kotlin/ley/anvil/modpacktools/util/config/Config.kt b/src/main/kotlin/ley/anvil/modpacktools/util/config/Config.kt index b43cae8..213b20c 100644 --- a/src/main/kotlin/ley/anvil/modpacktools/util/config/Config.kt +++ b/src/main/kotlin/ley/anvil/modpacktools/util/config/Config.kt @@ -8,7 +8,7 @@ class Config(val configName: String) { val config = readConfig() /** - * reads the config it it exists and the default config otherwise + * reads the [configLocation] file if it exists and the default config otherwise * * @return the Toml object of the config file */ @@ -21,14 +21,14 @@ class Config(val configName: String) { } /** - * Checks if the config file exists + * Checks if the [configLocation] file exists * * @return true if the config file exists */ val exists: Boolean get() = configLocation.exists() /** - * Copies the Config file from the resources into the tool's folder + * Copies the Config file from the resources into the project's folder */ fun copyConfig() { //copy from resources diff --git a/src/main/kotlin/ley/anvil/modpacktools/util/config/ConfigToml.kt b/src/main/kotlin/ley/anvil/modpacktools/util/config/ConfigToml.kt index 82c9f2c..c5d20b0 100644 --- a/src/main/kotlin/ley/anvil/modpacktools/util/config/ConfigToml.kt +++ b/src/main/kotlin/ley/anvil/modpacktools/util/config/ConfigToml.kt @@ -15,7 +15,7 @@ class ConfigToml : Toml() { /** * gets a path from a config. - * when getting an Int do NOT supply int to T. instead supply Long and then convert to Int! + * when getting an [Int] do NOT supply int to [T]. instead supply [Long] and then convert to [Int]! * * @param T what to get from the config * @param path the path to get from the config separated by /, . or \ @@ -24,7 +24,7 @@ class ConfigToml : Toml() { /** * gets a path from a config. - * when getting an Int do NOT supply int to T. instead supply Long and then convert to Int! + * when getting an [Int] do NOT supply int to [T]. instead supply [Long] and then convert to [Int]! * * @param T what to get from the config * @param path the path to get from the config @@ -37,8 +37,8 @@ class ConfigToml : Toml() { } /** - * gets a path from a config and throws a MissingConfigValueException if not found. - * when getting an Int do NOT supply int to T. instead supply Long and then convert to Int! + * gets a path from a config and throws a [MissingConfigValueException] if not found. + * when getting an [Int] do NOT supply int to [T]. instead supply [Long] and then convert to [Int]! * * @param T what to get from the config * @param path the path to get from the config separated by /, . or \ @@ -47,8 +47,8 @@ class ConfigToml : Toml() { fun pathOrException(path: String, message: String? = null): T = getPath(path) ?: throw MissingConfigValueException(path, message) /** - * gets a path from a config and throws a MissingConfigValueException if not found. - * when getting an Int do NOT supply int to T. instead supply Long and then convert to Int! + * gets a path from a config and throws a [MissingConfigValueException] if not found. + * when getting an [Int] do NOT supply int to [T]. instead supply [Long] and then convert to [Int]! * * @param T what to get from the config * @param path the path to get from the config