1
1
package dev .architectury .loom .forge ;
2
2
3
+ import java .io .IOException ;
3
4
import java .util .List ;
4
5
import java .util .Map ;
5
6
import java .util .Optional ;
7
+ import java .util .function .Function ;
6
8
9
+ import com .mojang .datafixers .util .Either ;
7
10
import com .mojang .serialization .Codec ;
8
11
import com .mojang .serialization .codecs .RecordCodecBuilder ;
9
12
10
13
import net .fabricmc .loom .configuration .providers .forge .ForgeRunTemplate ;
14
+ import net .fabricmc .loom .util .IOFunction ;
11
15
12
16
public record UserdevConfig (
13
17
String mcp ,
@@ -20,7 +24,8 @@ public record UserdevConfig(
20
24
BinaryPatcherConfig binpatcher ,
21
25
List <String > libraries ,
22
26
Map <String , ForgeRunTemplate > runs ,
23
- List <String > sass
27
+ List <String > sass ,
28
+ AccessTransformerLocation ats
24
29
) {
25
30
public static final Codec <UserdevConfig > CODEC = RecordCodecBuilder .create (instance -> instance .group (
26
31
Codec .STRING .fieldOf ("mcp" ).forGetter (UserdevConfig ::mcp ),
@@ -33,7 +38,8 @@ public record UserdevConfig(
33
38
BinaryPatcherConfig .CODEC .fieldOf ("binpatcher" ).forGetter (UserdevConfig ::binpatcher ),
34
39
Codec .STRING .listOf ().fieldOf ("libraries" ).forGetter (UserdevConfig ::libraries ),
35
40
ForgeRunTemplate .MAP_CODEC .fieldOf ("runs" ).forGetter (UserdevConfig ::runs ),
36
- Codec .STRING .listOf ().optionalFieldOf ("sass" , List .of ()).forGetter (UserdevConfig ::sass )
41
+ Codec .STRING .listOf ().optionalFieldOf ("sass" , List .of ()).forGetter (UserdevConfig ::sass ),
42
+ AccessTransformerLocation .CODEC .fieldOf ("ats" ).forGetter (UserdevConfig ::ats )
37
43
).apply (instance , UserdevConfig ::new ));
38
44
39
45
public record BinaryPatcherConfig (String dependency , List <String > args ) {
@@ -42,4 +48,38 @@ public record BinaryPatcherConfig(String dependency, List<String> args) {
42
48
Codec .STRING .listOf ().fieldOf ("args" ).forGetter (BinaryPatcherConfig ::args )
43
49
).apply (instance , BinaryPatcherConfig ::new ));
44
50
}
51
+
52
+ public sealed interface AccessTransformerLocation {
53
+ Codec <AccessTransformerLocation > CODEC = Codec .either (Codec .STRING , Codec .STRING .listOf ()).xmap (
54
+ either -> either .map (Directory ::new , FileList ::new ),
55
+ location -> location .visit (Either ::left , Either ::right )
56
+ );
57
+
58
+ <T > T visit (Function <String , T > ifDirectory , Function <List <String >, T > ifFileList );
59
+ <T > T visitIo (IOFunction <String , T > ifDirectory , IOFunction <List <String >, T > ifFileList ) throws IOException ;
60
+
61
+ record Directory (String path ) implements AccessTransformerLocation {
62
+ @ Override
63
+ public <T > T visit (Function <String , T > ifDirectory , Function <List <String >, T > ifFileList ) {
64
+ return ifDirectory .apply (path );
65
+ }
66
+
67
+ @ Override
68
+ public <T > T visitIo (IOFunction <String , T > ifDirectory , IOFunction <List <String >, T > ifFileList ) throws IOException {
69
+ return ifDirectory .apply (path );
70
+ }
71
+ }
72
+
73
+ record FileList (List <String > paths ) implements AccessTransformerLocation {
74
+ @ Override
75
+ public <T > T visit (Function <String , T > ifDirectory , Function <List <String >, T > ifFileList ) {
76
+ return ifFileList .apply (paths );
77
+ }
78
+
79
+ @ Override
80
+ public <T > T visitIo (IOFunction <String , T > ifDirectory , IOFunction <List <String >, T > ifFileList ) throws IOException {
81
+ return ifFileList .apply (paths );
82
+ }
83
+ }
84
+ }
45
85
}
0 commit comments