Skip to content

Commit 5f3304c

Browse files
committed
Codama AccountNode and DiscriminatorNode data structures.
1 parent fc11615 commit 5f3304c

File tree

5 files changed

+234
-0
lines changed

5 files changed

+234
-0
lines changed
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
package software.sava.idl.generator.codama;
2+
3+
import systems.comodal.jsoniter.JsonIterator;
4+
5+
import java.util.ArrayList;
6+
import java.util.List;
7+
8+
import static systems.comodal.jsoniter.JsonIterator.fieldEquals;
9+
10+
public final class AccountNode extends NamedDocsNode {
11+
12+
private final TypeNode data;
13+
private final LinkNode pda;
14+
private final int size;
15+
private final List<DiscriminatorNode> discriminators;
16+
17+
public AccountNode(final String name,
18+
final List<String> docs,
19+
final TypeNode data,
20+
final LinkNode pda,
21+
final int size,
22+
final List<DiscriminatorNode> discriminators) {
23+
super(name, docs);
24+
this.data = data;
25+
this.pda = pda;
26+
this.size = size;
27+
this.discriminators = discriminators;
28+
}
29+
30+
public TypeNode data() {
31+
return data;
32+
}
33+
34+
public LinkNode pda() {
35+
return pda;
36+
}
37+
38+
public int size() {
39+
return size;
40+
}
41+
42+
public List<DiscriminatorNode> discriminators() {
43+
return discriminators;
44+
}
45+
46+
public static AccountNode parse(final JsonIterator ji) {
47+
final var parser = new Parser();
48+
ji.testObject(parser);
49+
return parser.createAccountNode();
50+
}
51+
52+
static final class Parser extends BaseDocsParser {
53+
54+
private TypeNode data;
55+
private LinkNode pda;
56+
private int size;
57+
private List<DiscriminatorNode> discriminators;
58+
59+
private Parser() {
60+
}
61+
62+
AccountNode createAccountNode() {
63+
return new AccountNode(
64+
name,
65+
docs == null ? List.of() : docs,
66+
data,
67+
pda,
68+
size,
69+
discriminators == null ? List.of() : discriminators
70+
);
71+
}
72+
73+
@Override
74+
public boolean test(final char[] buf, final int offset, final int len, final JsonIterator ji) {
75+
if (fieldEquals("data", buf, offset, len)) {
76+
data = TypeNode.parse(ji);
77+
return true;
78+
} else if (fieldEquals("pda", buf, offset, len)) {
79+
pda = LinkNode.parse(ji);
80+
return true;
81+
} else if (fieldEquals("size", buf, offset, len)) {
82+
size = ji.readInt();
83+
return true;
84+
} else if (fieldEquals("discriminators", buf, offset, len)) {
85+
discriminators = new ArrayList<>();
86+
while (ji.readArray()) {
87+
discriminators.add(DiscriminatorNode.parse(ji));
88+
}
89+
return true;
90+
} else {
91+
return super.test(buf, offset, len, ji);
92+
}
93+
}
94+
}
95+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package software.sava.idl.generator.codama;
2+
3+
import systems.comodal.jsoniter.FieldBufferPredicate;
4+
import systems.comodal.jsoniter.JsonIterator;
5+
6+
import static systems.comodal.jsoniter.JsonIterator.fieldEquals;
7+
8+
public record ConstantDiscriminatorNode(ValueNode.Constant constant, int offset) implements DiscriminatorNode {
9+
10+
public static ConstantDiscriminatorNode parse(final JsonIterator ji) {
11+
final var parser = new Parser();
12+
ji.testObject(parser);
13+
return parser.createConstantDiscriminatorNode();
14+
}
15+
16+
static final class Parser implements FieldBufferPredicate {
17+
18+
private ValueNode.Constant constant;
19+
private int offset;
20+
21+
ConstantDiscriminatorNode createConstantDiscriminatorNode() {
22+
return new ConstantDiscriminatorNode(constant, offset);
23+
}
24+
25+
@Override
26+
public boolean test(final char[] buf, final int offset, final int len, final JsonIterator ji) {
27+
if (fieldEquals("constant", buf, offset, len)) {
28+
constant = ValueNode.Constant.parse(ji);
29+
} else if (fieldEquals("offset", buf, offset, len)) {
30+
this.offset = ji.readInt();
31+
} else {
32+
throw new IllegalStateException("Unhandled field " + String.valueOf(buf, offset, len));
33+
}
34+
return true;
35+
}
36+
}
37+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package software.sava.idl.generator.codama;
2+
3+
import systems.comodal.jsoniter.JsonIterator;
4+
5+
public sealed interface DiscriminatorNode permits
6+
ConstantDiscriminatorNode,
7+
FieldDiscriminatorNode,
8+
SizeDiscriminatorNode {
9+
10+
static DiscriminatorNode parse(final JsonIterator ji) {
11+
final var kind = ji.skipObjField().readString();
12+
return switch (kind) {
13+
case "constantDiscriminatorNode" -> ConstantDiscriminatorNode.parse(ji);
14+
case "fieldDiscriminatorNode" -> FieldDiscriminatorNode.parse(ji);
15+
case "sizeDiscriminatorNode" -> SizeDiscriminatorNode.parse(ji);
16+
default -> throw new UnsupportedOperationException(kind);
17+
};
18+
}
19+
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package software.sava.idl.generator.codama;
2+
3+
import systems.comodal.jsoniter.JsonIterator;
4+
5+
import static systems.comodal.jsoniter.JsonIterator.fieldEquals;
6+
7+
final class FieldDiscriminatorNode extends NamedNode implements DiscriminatorNode {
8+
9+
private final int offset;
10+
11+
public FieldDiscriminatorNode(final String name, final int offset) {
12+
super(name);
13+
this.offset = offset;
14+
}
15+
16+
public int offset() {
17+
return offset;
18+
}
19+
20+
public static FieldDiscriminatorNode parse(final JsonIterator ji) {
21+
final var parser = new Parser();
22+
ji.testObject(parser);
23+
return parser.createFieldDiscriminatorNode();
24+
}
25+
26+
static final class Parser extends BaseParser {
27+
28+
private int offset;
29+
30+
FieldDiscriminatorNode createFieldDiscriminatorNode() {
31+
return new FieldDiscriminatorNode(name, offset);
32+
}
33+
34+
@Override
35+
public boolean test(final char[] buf, final int offset, final int len, final JsonIterator ji) {
36+
if (fieldEquals("offset", buf, offset, len)) {
37+
this.offset = ji.readInt();
38+
return true;
39+
} else {
40+
return super.test(buf, offset, len, ji);
41+
}
42+
}
43+
}
44+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package software.sava.idl.generator.codama;
2+
3+
import systems.comodal.jsoniter.FieldBufferPredicate;
4+
import systems.comodal.jsoniter.JsonIterator;
5+
6+
import static systems.comodal.jsoniter.JsonIterator.fieldEquals;
7+
8+
record SizeDiscriminatorNode(int size) implements DiscriminatorNode {
9+
10+
public static SizeDiscriminatorNode parse(final JsonIterator ji) {
11+
final var parser = new Parser();
12+
ji.testObject(parser);
13+
return parser.createSizeDiscriminatorNode();
14+
}
15+
16+
static final class Parser implements FieldBufferPredicate {
17+
18+
private int size;
19+
20+
SizeDiscriminatorNode createSizeDiscriminatorNode() {
21+
return new SizeDiscriminatorNode(size);
22+
}
23+
24+
@Override
25+
public boolean test(final char[] buf, final int offset, final int len, final JsonIterator ji) {
26+
if (fieldEquals("size", buf, offset, len)) {
27+
size = ji.readInt();
28+
} else if (fieldEquals("kind", buf, offset, len)) {
29+
ji.skip();
30+
} else {
31+
throw new IllegalStateException(String.format(
32+
"Unhandled %s field %s.",
33+
getClass().getSimpleName(), new String(buf, offset, len)
34+
));
35+
}
36+
return true;
37+
}
38+
}
39+
}

0 commit comments

Comments
 (0)