Skip to content

Commit 7d5cd78

Browse files
Steve RamageSJrX
authored andcommitted
Resolves #254 - Add validation support for around 50 more options
1 parent d08fff7 commit 7d5cd78

File tree

12 files changed

+512
-10
lines changed

12 files changed

+512
-10
lines changed

README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,8 @@ This plugin adds support for [systemd unit files](https://www.freedesktop.org/so
2222
* When the section name is invalid or used in the wrong file type
2323
* Whitespace after a line continuation \ character.
2424
* When a key has been deprecated.
25-
* Built-in documentation for options or section name (available when hitting <kbd>CTRL+Q</kbd> or <kbd>F1</kbd> on Mac)
25+
* Built-in documentation for options or section name (available when hitting <kbd>CTRL+Q</kbd> or <kbd>F1</kbd> on Mac)
26+
* Templates for several unit types
2627

2728
2829
## Usage

src/main/kotlin/net/sjrx/intellij/plugins/systemdunitfiles/semanticdata/SemanticDataRepository.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ class SemanticDataRepository private constructor() {
7070
}
7171

7272
validatorMap.putAll(BooleanOptionValue.validators)
73+
validatorMap.putAll(TriStateOptionValue.validators)
7374
validatorMap.putAll(DocumentationOptionValue.validators)
7475
validatorMap.putAll(ModeStringOptionValue.validators)
7576
validatorMap.putAll(ExecOptionValue.validators)
@@ -81,7 +82,9 @@ class SemanticDataRepository private constructor() {
8182
validatorMap.putAll(UnsignedIntegerOptionValue.validators)
8283
validatorMap.putAll(PathOptionValue.validators)
8384
validatorMap.putAll(EnumOptionValues.validators)
84-
validatorMap.putAll(ConfigParseSecOptionValue.validators)
85+
validatorMap.putAll(ConfigParseSecValidators.validators)
86+
validatorMap.putAll(AllowedCpuSetOptionValue.validators)
87+
validatorMap.putAll(TtySizeOptionValue.validators)
8588

8689
// Scopes are not supported since they aren't standard unit files.
8790

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
package net.sjrx.intellij.plugins.systemdunitfiles.semanticdata.optionvalues
2+
3+
import com.intellij.openapi.project.Project
4+
import net.sjrx.intellij.plugins.systemdunitfiles.semanticdata.Validator
5+
import java.util.regex.Pattern
6+
7+
class AllowedCpuSetOptionValue() : OptionValueInformation {
8+
override fun getAutoCompleteOptions(project: Project): Set<String> {
9+
return emptySet()
10+
}
11+
12+
override fun getErrorMessage(value: String): String? {
13+
val cpuSetElement = value.split(" ", ",")
14+
15+
// Loop over cpuSetElement and for each element, if it's an integer do continue
16+
// if it's a range value that the first value is less than the second
17+
18+
for (element in cpuSetElement) {
19+
20+
if (element.length == 0) {
21+
continue
22+
}
23+
24+
// Note we don't validate the input very much because
25+
// the regex is very tight, so we know we have integers.
26+
27+
if (element.matches(CPU_ELEMENT_REGEX.toRegex())) {
28+
val range = element.split("-")
29+
if (range.size == 2) {
30+
31+
32+
val start = range[0].toInt()
33+
val end = range[1].toInt()
34+
if (start > end) {
35+
return "The start %d of the range must be less than the end %d of the range".format(start, end)
36+
}
37+
}
38+
39+
} else {
40+
return "Invalid syntax for CPU Range: %s".format(element)
41+
}
42+
}
43+
44+
return null
45+
46+
47+
}
48+
49+
override val validatorName: String
50+
get() = VALIDATOR_NAME
51+
52+
companion object {
53+
const val VALIDATOR_NAME = "config_parse_allowed_cpuset"
54+
55+
private val CPU_ELEMENT_REGEX= Pattern.compile("^[0-9]+(-[0-9]+)?$")
56+
val validators = mapOf(Validator(VALIDATOR_NAME) to AllowedCpuSetOptionValue())
57+
}
58+
}

src/main/kotlin/net/sjrx/intellij/plugins/systemdunitfiles/semanticdata/optionvalues/ConfigParseSecOptionValue.kt

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,10 @@ package net.sjrx.intellij.plugins.systemdunitfiles.semanticdata.optionvalues
22

33
import com.intellij.openapi.project.Project
44
import net.sjrx.intellij.plugins.systemdunitfiles.semanticdata.Validator
5+
import net.sjrx.intellij.plugins.systemdunitfiles.semanticdata.optionvalues.ConfigParseSecOptionValue.Companion.VALIDATOR_NAME
6+
7+
abstract class AbstractConfigParseSecOptionValue(override val validatorName: String) : OptionValueInformation {
58

6-
class ConfigParseSecOptionValue : OptionValueInformation {
79
override fun getAutoCompleteOptions(project: Project): Set<String> {
810
return emptySet()
911
}
@@ -17,14 +19,31 @@ class ConfigParseSecOptionValue : OptionValueInformation {
1719

1820
}
1921
}
22+
}
2023

21-
override val validatorName : String
22-
get() = VALIDATOR_NAME
23-
24-
24+
class ConfigParseSecOptionValue : AbstractConfigParseSecOptionValue(VALIDATOR_NAME){
2525
companion object {
2626
const val VALIDATOR_NAME = "config_parse_sec"
27+
}
28+
}
29+
30+
class ConfigParseSecFix0OptionValue : AbstractConfigParseSecOptionValue(VALIDATOR_NAME){
31+
companion object {
32+
const val VALIDATOR_NAME = "config_parse_sec_fix_0"
33+
}
34+
}
2735

28-
val validators = mapOf(Validator(VALIDATOR_NAME, "0") to ConfigParseSecOptionValue())
36+
class ConfigParseSecDefInifinityOptionValue : AbstractConfigParseSecOptionValue(VALIDATOR_NAME){
37+
companion object {
38+
const val VALIDATOR_NAME = "config_parse_sec_def_infinity"
2939
}
3040
}
41+
42+
43+
object ConfigParseSecValidators {
44+
val validators = mapOf(
45+
Validator(ConfigParseSecOptionValue.VALIDATOR_NAME, "0") to ConfigParseSecOptionValue(),
46+
Validator(ConfigParseSecFix0OptionValue.VALIDATOR_NAME, "0") to ConfigParseSecFix0OptionValue(),
47+
Validator(ConfigParseSecDefInifinityOptionValue.VALIDATOR_NAME, "0") to ConfigParseSecDefInifinityOptionValue()
48+
)
49+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package net.sjrx.intellij.plugins.systemdunitfiles.semanticdata.optionvalues
2+
3+
import com.google.common.collect.ImmutableSet
4+
import com.intellij.openapi.project.Project
5+
import net.sjrx.intellij.plugins.systemdunitfiles.semanticdata.Validator
6+
import java.util.*
7+
8+
/**
9+
* This validator is for the config_parse_bool validator.
10+
*
11+
*
12+
* The code for this is in: parse-util.c ~ line 21
13+
*
14+
*/
15+
class TriStateOptionValue : OptionValueInformation {
16+
override fun getAutoCompleteOptions(project: Project): Set<String> {
17+
return autoCompleteValues
18+
}
19+
20+
override fun getErrorMessage(value: String): String? {
21+
return if (validValuesLowerCase.contains(value.lowercase(Locale.getDefault()))) {
22+
null
23+
} else {
24+
"This option takes a boolean value, " + value + " must be one of: " + validValuesLowerCase + " or the empty string"
25+
}
26+
}
27+
28+
override val validatorName: String
29+
get() = VALIDATOR_NAME
30+
31+
companion object {
32+
private val validValuesLowerCase: Set<String> = ImmutableSet.of("", "1", "yes", "y", "true", "t", "on", "0", "no", "n", "false", "f", "off")
33+
private val autoCompleteValues: Set<String> = ImmutableSet.of("on", "off", "yes", "no", "true", "false")
34+
const val VALIDATOR_NAME = "config_parse_tristate"
35+
36+
val validators = mapOf(
37+
Validator(VALIDATOR_NAME, "0") to TriStateOptionValue(),
38+
39+
)
40+
41+
42+
}
43+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package net.sjrx.intellij.plugins.systemdunitfiles.semanticdata.optionvalues
2+
3+
import com.intellij.openapi.project.Project
4+
import net.sjrx.intellij.plugins.systemdunitfiles.semanticdata.Validator
5+
6+
class TtySizeOptionValue : OptionValueInformation {
7+
8+
override fun getAutoCompleteOptions(project: Project): Set<String> {
9+
return emptySet()
10+
}
11+
12+
override fun getErrorMessage(value: String): String? {
13+
try {
14+
Integer.parseUnsignedInt(value)
15+
return null
16+
} catch(e : NumberFormatException) {
17+
return "This value must be an unsigned integer"
18+
}
19+
}
20+
21+
override val validatorName: String
22+
get() = VALIDATOR_NAME
23+
24+
companion object {
25+
const val VALIDATOR_NAME="config_parse_tty_size"
26+
27+
val validators = mapOf(Validator(VALIDATOR_NAME, "0") to TtySizeOptionValue())
28+
}
29+
}

src/main/resources/META-INF/plugin.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
<li>Inspections for some errors such as invalid or unknown or deprecated options</li>
1616
<li>Quick fixes</li>
1717
<li>Built-in documentation reference for options</li>
18+
<li>Templates for unit files</li>
1819
</ul>
1920
]]></description>
2021

0 commit comments

Comments
 (0)