Skip to content

Commit 6c88866

Browse files
committed
Improve Struct and Member stringification
1 parent dfc8cf1 commit 6c88866

File tree

6 files changed

+69
-0
lines changed

6 files changed

+69
-0
lines changed

scijava-ops-engine/src/main/java/org/scijava/ops/engine/struct/AnnotatedOpDependencyMember.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import org.scijava.ops.engine.OpDependencyMember;
3434
import org.scijava.ops.spi.OpDependency;
3535
import org.scijava.struct.Member;
36+
import org.scijava.struct.Structs;
3637

3738
import java.lang.reflect.Type;
3839
import java.util.function.Supplier;
@@ -144,4 +145,9 @@ private synchronized void generateDescription() {
144145
public Type type() {
145146
return type;
146147
}
148+
149+
@Override
150+
public String toString() {
151+
return Structs.toString(this);
152+
}
147153
}

scijava-ops-engine/src/main/java/org/scijava/ops/engine/struct/ConvertedParameterMember.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333

3434
import org.scijava.struct.ItemIO;
3535
import org.scijava.struct.Member;
36+
import org.scijava.struct.Structs;
3637

3738
/**
3839
* {@link Member} whose {@link Type} has been converted into another
@@ -85,4 +86,9 @@ public ItemIO getIOType() {
8586
public boolean isRequired() {
8687
return original.isRequired();
8788
}
89+
90+
@Override
91+
public String toString() {
92+
return Structs.toString(this);
93+
}
8894
}

scijava-ops-engine/src/main/java/org/scijava/ops/engine/struct/OpRetypingMemberParser.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
import org.scijava.struct.Member;
4040
import org.scijava.struct.MemberParser;
4141
import org.scijava.struct.Struct;
42+
import org.scijava.struct.Structs;
4243

4344
public class OpRetypingMemberParser implements
4445
MemberParser<RetypingRequest, Member<?>>
@@ -112,6 +113,11 @@ public Type type() {
112113
public ItemIO getIOType() {
113114
return fmt.itemIO();
114115
}
116+
117+
@Override
118+
public String toString() {
119+
return Structs.toString(this);
120+
}
115121
};
116122
}
117123

scijava-ops-engine/src/main/java/org/scijava/ops/engine/struct/SynthesizedParameterMember.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333

3434
import org.scijava.struct.ItemIO;
3535
import org.scijava.struct.Member;
36+
import org.scijava.struct.Structs;
3637

3738
/**
3839
* {@link Member} synthesized using constructor arguments
@@ -87,4 +88,9 @@ public ItemIO getIOType() {
8788
public boolean isRequired() {
8889
return isRequired;
8990
}
91+
92+
@Override
93+
public String toString() {
94+
return Structs.toString(this);
95+
}
9096
}

scijava-struct/src/main/java/org/scijava/struct/Structs.java

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,10 @@
3333
import java.lang.reflect.Type;
3434
import java.util.ArrayList;
3535
import java.util.List;
36+
import java.util.stream.Collectors;
3637

3738
import org.scijava.common3.Classes;
39+
import org.scijava.types.Types;
3840

3941
public final class Structs {
4042

@@ -97,4 +99,33 @@ public static boolean isImmutable(final Class<?> type) {
9799
Classes.isBoolean(type);
98100
}
99101

102+
public static String toString(Struct struct) {
103+
return toString(struct, 0);
104+
}
105+
106+
public static String toString(Member<?> member) {
107+
return toString(member, 0);
108+
}
109+
110+
private static String toString(Struct struct, int level) {
111+
String indent = " ".repeat(2 * level);
112+
return indent + String.join("\n" + indent,
113+
struct.members().stream()
114+
.map(m -> toString(m, level))
115+
.collect(Collectors.toList())
116+
);
117+
}
118+
119+
private static String toString(Member<?> member, int level) {
120+
String desc = member.description();
121+
String descriptionSuffix = desc == null ? "" : " {" + desc.trim() + "}";
122+
return String.format("%s: %s%s [%s]%s%s",
123+
member.key(),
124+
Types.name(member.type()),
125+
member.isRequired() ? "" : "?",
126+
member.getIOType(),
127+
descriptionSuffix,
128+
member.isStruct() ? "\n" + toString(member.childStruct(), level + 1) : ""
129+
);
130+
}
100131
}

scijava-struct/src/test/java/org/scijava/struct/StructTest.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,20 @@ public void testNestedStructs() {
130130
assertEquals("asdf", nestedMembers.get("vp.d"));
131131
assertEquals(5.4, nestedMembers.get("vp.o"));
132132
assertEquals("fdsa", nestedMembers.get("vp.p"));
133+
134+
var expectedString =
135+
"np: org.scijava.struct.StructTest$NestedParameters [INPUT]\n" +
136+
" stuff: java.lang.String [INPUT]\n" +
137+
" vp: org.scijava.struct.StructTest$VariousParameters [INPUT]\n" +
138+
" a: int [INPUT]\n" +
139+
" b: java.lang.Double [INPUT]\n" +
140+
" c: byte [INPUT]\n" +
141+
" d: java.lang.Object [INPUT]\n" +
142+
" o: double [OUTPUT]\n" +
143+
" p: java.lang.String [OUTPUT]\n" +
144+
" things: java.lang.String [OUTPUT]\n" +
145+
"junk: java.lang.String [INPUT]";
146+
assertEquals(expectedString, Structs.toString(hlpStruct));
133147
}
134148

135149
// -- Helper methods --

0 commit comments

Comments
 (0)