11package  com .amazon .tools .cli ;
22
33
4+ import  com .amazon .ion .IonEncodingVersion ;
45import  com .amazon .ion .IonReader ;
56import  com .amazon .ion .IonWriter ;
67import  com .amazon .ion .system .IonReaderBuilder ;
@@ -42,8 +43,12 @@ public static void main(String[] args) {
4243        System .exit (commandLine .execute (args ));
4344    }
4445
46+     @ Option (names ={"-v" , "--ion-version" }, description  = "Output Ion version" , defaultValue  = "1.0" ,
47+             converter  = IonEncodingVersionConverter .class , scope  = CommandLine .ScopeType .INHERIT )
48+     IonEncodingVersion  ionVersion ;
49+ 
4550    @ Option (names ={"-f" , "--format" , "--output-format" }, defaultValue  = "pretty" ,
46-             description  = "Output format, from the set (text | pretty | binary | none)." ,
51+             description  = "Output format, from the set (text | pretty | binary | debug |  none)." ,
4752            paramLabel  = "<format>" ,
4853    scope  = CommandLine .ScopeType .INHERIT )
4954    OutputFormat  outputFormat ;
@@ -57,17 +62,13 @@ public static void main(String[] args) {
5762            mixinStandardHelpOptions  = true )
5863    int  cat ( @ Parameters (paramLabel  = "FILE" ) File ... files ) {
5964
60-         if  (outputFormat  == OutputFormat .EVENTS ) {
61-             System .err .println ("'events' output format is not supported" );
62-             return  CommandLine .ExitCode .USAGE ;
63-         }
6465
6566        //TODO: Handle stream cutoff- java.io.IOException: Broken pipe 
6667        //TODO: This is not resilient to problems with a single file. Should it be? 
6768        try  (InputStream  in  = getInputStream (files );
6869             IonReader  reader  = IonReaderBuilder .standard ().build (in );
6970             OutputStream  out  = getOutputStream (outputFile );
70-              IonWriter  writer  = outputFormat . createIonWriter ( out )) {
71+              IonWriter  writer  = getWriter ( ionVersion ,  outputFormat ,  out )) {
7172            // getInputStream will look for stdin if we don't supply 
7273            writer .writeValues (reader );
7374        } catch  (IOException  e ) {
@@ -111,4 +112,48 @@ private static FileOutputStream getOutputStream(File outputFile) throws IOExcept
111112        // non-line-buffered stdout, or the requested file output 
112113        return  outputFile  == null  ? new  FileOutputStream (FileDescriptor .out ) : new  FileOutputStream (outputFile );
113114    }
115+ 
116+     private  static  IonWriter  getWriter (IonEncodingVersion <?,?> version , OutputFormat  format , OutputStream  out ) {
117+         if  (version  == IonEncodingVersion .ION_1_0 ) return  getWriter_1_0 (format , out );
118+         if  (version  == IonEncodingVersion .ION_1_1 ) return  getWriter_1_1 (format , out );
119+         throw  new  IllegalArgumentException ("Unrecognized IonEncodingVersion: "  + version );
120+     }
121+ 
122+     private  static  IonWriter  getWriter_1_0 (OutputFormat  format , OutputStream  out ) {
123+         switch  (format ) {
124+             case  Pretty : return  IonEncodingVersion .ION_1_0 .textWriterBuilder ().withPrettyPrinting ().build (out );
125+             case  Text : return  IonEncodingVersion .ION_1_0 .textWriterBuilder ().build (out );
126+             case  Binary : return  IonEncodingVersion .ION_1_0 .binaryWriterBuilder ().build (out );
127+             case  Debug : throw  new  UnsupportedOperationException ("Not yet supported, pending ion-java #1005" );
128+             case  None : return  IonEncodingVersion .ION_1_0 .textWriterBuilder ().build (new  NoOpOutputStream ());
129+             default : throw  new  IllegalArgumentException ("Unrecognized or unsupported output format: "  + format );
130+         }
131+     }
132+ 
133+     private  static  IonWriter  getWriter_1_1 (OutputFormat  format , OutputStream  out ) {
134+         switch  (format ) {
135+             case  Pretty : return  IonEncodingVersion .ION_1_1 .textWriterBuilder ().withPrettyPrinting ().build (out );
136+             case  Text : return  IonEncodingVersion .ION_1_1 .textWriterBuilder ().build (out );
137+             case  Binary : return  IonEncodingVersion .ION_1_1 .binaryWriterBuilder ().build (out );
138+             case  Debug : throw  new  UnsupportedOperationException ("Not yet supported, pending ion-java #1005" );
139+             case  None : return  IonEncodingVersion .ION_1_1 .textWriterBuilder ().build (new  NoOpOutputStream ());
140+             default : throw  new  IllegalArgumentException ("Unrecognized or unsupported output format: "  + format );
141+         }
142+     }
143+ 
144+     private  enum  OutputFormat  {
145+         Pretty , Text , Binary , Debug , None 
146+     }
147+ 
148+     private  static  class  IonEncodingVersionConverter  implements  CommandLine .ITypeConverter <IonEncodingVersion <?,?>> {
149+ 
150+         @ Override 
151+         public  IonEncodingVersion <?,?> convert (String  ionVersion ) {
152+             switch  (ionVersion ) {
153+                 case  "1.0" : return  IonEncodingVersion .ION_1_0 ;
154+                 case  "1.1" : return  IonEncodingVersion .ION_1_1 ;
155+                 default : throw  new  IllegalArgumentException ("Unrecognized or unsupported Ion version: "  + ionVersion );
156+             }
157+         }
158+     }
114159}
0 commit comments