Skip to content

Commit 0517913

Browse files
committed
Simplify OutputFormat
1 parent ed75e47 commit 0517913

File tree

1 file changed

+41
-73
lines changed

1 file changed

+41
-73
lines changed

ion-java-cli/src/main/java/com/amazon/tools/cli/OutputFormat.java

Lines changed: 41 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -4,85 +4,53 @@
44
import com.amazon.ion.SymbolTable;
55
import com.amazon.ion.system.IonBinaryWriterBuilder;
66
import com.amazon.ion.system.IonTextWriterBuilder;
7+
import com.amazon.ion.system.IonWriterBuilder;
78

89
import java.io.OutputStream;
10+
import java.util.function.Function;
11+
import java.util.function.Supplier;
912

1013
/**
1114
* Represents the different Ion output formats supported by the command line com.amazon.tools in this package.
1215
*/
1316
public enum OutputFormat {
14-
/**
15-
* Nicely spaced, 'prettified' text Ion.
16-
*/
17-
PRETTY {
18-
@Override
19-
public IonWriter createIonWriter(OutputStream outputStream) {
20-
return IonTextWriterBuilder.pretty().build(outputStream);
21-
}
22-
23-
@Override
24-
public IonWriter createIonWriterWithImports(OutputStream outputStream, SymbolTable[] imports) {
25-
return IonTextWriterBuilder.pretty().withImports(imports).build(outputStream);
26-
}
27-
},
28-
/**
29-
* Minimally spaced text Ion.
30-
*/
31-
TEXT {
32-
@Override
33-
public IonWriter createIonWriter(OutputStream outputStream) {
34-
return IonTextWriterBuilder.standard().build(outputStream);
35-
}
36-
37-
@Override
38-
public IonWriter createIonWriterWithImports(OutputStream outputStream, SymbolTable[] imports) {
39-
return IonTextWriterBuilder.standard().withImports(imports).build(outputStream);
40-
}
41-
},
42-
/**
43-
* Compact, read-optimized binary Ion.
44-
*/
45-
BINARY {
46-
@Override
47-
public IonWriter createIonWriter(OutputStream outputStream) {
48-
return IonBinaryWriterBuilder.standard().build(outputStream);
49-
}
50-
51-
@Override
52-
public IonWriter createIonWriterWithImports(OutputStream outputStream, SymbolTable[] imports) {
53-
return IonBinaryWriterBuilder.standard().withImports(imports).build(outputStream);
54-
}
55-
},
56-
/**
57-
* Event Stream
58-
*/
59-
EVENTS {
60-
@Override
61-
public IonWriter createIonWriter(OutputStream outputStream) {
62-
return IonTextWriterBuilder.pretty().build(outputStream);
63-
}
64-
65-
@Override
66-
public IonWriter createIonWriterWithImports(OutputStream outputStream, SymbolTable[] imports) {
67-
return IonTextWriterBuilder.pretty().withImports(imports).build(outputStream);
68-
}
69-
},
70-
/**
71-
* None
72-
*/
73-
NONE {
74-
@Override
75-
public IonWriter createIonWriter(OutputStream outputStream) {
76-
NoOpOutputStream out = new NoOpOutputStream();
77-
return IonTextWriterBuilder.standard().build(out);
78-
}
79-
80-
@Override
81-
public IonWriter createIonWriterWithImports(OutputStream outputStream, SymbolTable[] imports) {
82-
return IonTextWriterBuilder.standard().withImports(imports).build(outputStream);
83-
}
84-
};
17+
/** Nicely spaced, 'prettified' text Ion */
18+
PRETTY(IonTextWriterBuilder::pretty),
19+
/** Minimally spaced text Ion */
20+
TEXT(IonTextWriterBuilder::standard),
21+
/** Compact, read-optimized binary Ion */
22+
BINARY(IonBinaryWriterBuilder::standard),
23+
/** Event Stream */
24+
EVENTS(IonTextWriterBuilder::pretty),
25+
/** No output, /dev/null */
26+
NONE(IonTextWriterBuilder::standard, o -> new NoOpOutputStream());
27+
28+
OutputFormat(Supplier<IonWriterBuilder> supplier) {
29+
this(supplier, o -> o);
30+
}
31+
32+
OutputFormat(Supplier<IonWriterBuilder> supplier, Function<OutputStream, OutputStream> function) {
33+
this.writerBuilderSupplier = supplier;
34+
this.outputTransformer = function;
35+
}
36+
37+
IonWriter createIonWriter(OutputStream outputStream) {
38+
return writerBuilderSupplier.get().build(outputTransformer.apply(outputStream));
39+
}
40+
41+
IonWriter createIonWriterWithImports(OutputStream outputStream, SymbolTable[] symbolTable) {
42+
IonWriterBuilder builder = writerBuilderSupplier.get();
43+
OutputStream out = outputTransformer.apply(outputStream);
44+
if (builder instanceof IonTextWriterBuilder) {
45+
return ((IonTextWriterBuilder)builder).withImports(symbolTable).build(out);
46+
} else if (builder instanceof IonBinaryWriterBuilder) {
47+
return ((IonBinaryWriterBuilder)builder).withImports(symbolTable).build(out);
48+
} else {
49+
throw new IllegalStateException("This is impossible, none of the enums can do this");
50+
}
51+
}
52+
53+
private final Supplier<IonWriterBuilder> writerBuilderSupplier;
54+
private final Function<OutputStream, OutputStream> outputTransformer;
8555

86-
abstract IonWriter createIonWriter(OutputStream outputStream);
87-
abstract IonWriter createIonWriterWithImports(OutputStream outputStream, SymbolTable[] symbolTable);
8856
}

0 commit comments

Comments
 (0)