summaryrefslogtreecommitdiff
path: root/support/arara/source/src/main/kotlin/org/islandoftex/arara/configuration/AraraSpec.kt
blob: 14100ec98b128980f04e7bc1460f8ded6421bb71 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
// SPDX-License-Identifier: BSD-3-Clause
package org.islandoftex.arara.configuration

import com.uchuhimo.konf.ConfigSpec
import java.io.File
import java.nio.file.Paths
import kotlin.time.ExperimentalTime
import kotlin.time.milliseconds
import org.islandoftex.arara.localization.Language

/**
 * Configuration hierarchy for arara
 *
 * @author Island of TeX
 * @version 5.0
 * @since 5.0
 */
@Suppress("MagicNumber")
object AraraSpec : ConfigSpec() {
    object Application : ConfigSpec() {
        val defaultLanguageCode by optional("en")
        val version by optional(AraraSpec::class.java.`package`.implementationVersion
                ?: "DEVELOPMENT BUILD")
        val namePattern by optional("arara:\\s")
        val width by optional(65)
    }

    object Execution : ConfigSpec() {
        val maxLoops by optional(10)
        val timeout by optional(false)
        @ExperimentalTime
        val timeoutValue by optional(0.milliseconds)
        val haltOnErrors by optional(true)

        val databaseName by optional("arara")
        val logName by optional("arara")

        val verbose by optional(false)
        val language by optional(Language(Application.defaultLanguageCode.default))
        val logging by optional(false)
        val dryrun by optional(false)
        val status by optional(0)
        val fileTypes by optional(ConfigurationUtils.defaultFileTypes)
        val rulePaths by optional(setOf(
                ConfigurationUtils.applicationPath.resolve("rules")
                        .toString()
        ))
        val preambles by optional(mapOf<String, String>())
        val preamblesActive by optional(false)
        val preamblesContent by optional("")

        val workingDirectory by optional(Paths.get(""))
        val configurationName by optional("[none]")
        val onlyHeader by optional(false)

        // TODO: these are runtime values, they should be properly
        // initialized and tested (maybe move them into their own
        // Spec or session)
        val reference by optional(File("/tmp/"))
        val file by optional(File("/tmp/"))

        object InfoSpec : ConfigSpec() {
            val ruleId by optional<String?>(null)
            val rulePath by optional<String?>(null)
        }

        object DirectiveSpec : ConfigSpec() {
            val lines by optional(listOf<Int>())
        }

        val filePattern by optional("")
    }

    object Directive : ConfigSpec() {
        val linebreakPattern by optional("^\\s*-->\\s(.*)$")

        private const val directivestart = """^\s*(\w+)\s*(:\s*(\{.*\})\s*)?"""
        private const val pattern = """(\s+(if|while|until|unless)\s+(\S.*))?$"""
        val directivePattern by optional(directivestart + pattern)
    }

    object UserInteraction : ConfigSpec() {
        val lookAndFeel by optional("none")
        val displayTime by optional(false)
        val displayLine by optional(true)
        val displayResult by optional(false)
        val displayRolling by optional(false)
        val displayException by optional(false)
    }
}