@@ -26,6 +26,12 @@ const (
2626 exitJSONEncode
2727)
2828
29+ // Option bitfields
30+ const (
31+ optMonochrome = iota + 1
32+ optNoSort
33+ )
34+
2935// Output colors
3036var (
3137 strColor = color .New (color .FgYellow )
@@ -49,6 +55,7 @@ func init() {
4955 h += "Options:\n "
5056 h += " -u, --ungron Reverse the operation (turn assignments back into JSON)\n "
5157 h += " -m, --monochrome Monochrome (don't colorize output)\n "
58+ h += " --no-sort Don't sort output (faster)\n "
5259 h += " --version Print version information\n \n "
5360
5461 h += "Exit Codes:\n "
@@ -75,14 +82,16 @@ func main() {
7582 var (
7683 ungronFlag bool
7784 monochromeFlag bool
85+ noSortFlag bool
7886 versionFlag bool
7987 )
8088
81- flag .BoolVar (& ungronFlag , "ungron" , false , "Turn statements into JSON instead" )
82- flag .BoolVar (& ungronFlag , "u" , false , "Turn statements into JSON instead" )
83- flag .BoolVar (& monochromeFlag , "monochrome" , false , "Monochrome (don't colorize output)" )
84- flag .BoolVar (& monochromeFlag , "m" , false , "Monochrome (don't colorize output)" )
85- flag .BoolVar (& versionFlag , "version" , false , "Print version information" )
89+ flag .BoolVar (& ungronFlag , "ungron" , false , "" )
90+ flag .BoolVar (& ungronFlag , "u" , false , "" )
91+ flag .BoolVar (& monochromeFlag , "monochrome" , false , "" )
92+ flag .BoolVar (& monochromeFlag , "m" , false , "" )
93+ flag .BoolVar (& noSortFlag , "no-sort" , false , "" )
94+ flag .BoolVar (& versionFlag , "version" , false , "" )
8695
8796 flag .Parse ()
8897
@@ -113,11 +122,19 @@ func main() {
113122 }
114123 }
115124
125+ var opts int
126+ if monochromeFlag {
127+ opts = opts | optMonochrome
128+ }
129+ if noSortFlag {
130+ opts = opts | optNoSort
131+ }
132+
116133 var a actionFn = gron
117134 if ungronFlag {
118135 a = ungron
119136 }
120- exitCode , err := a (raw , os .Stdout , monochromeFlag )
137+ exitCode , err := a (raw , os .Stdout , opts )
121138
122139 if exitCode != exitOK {
123140 fatal (exitCode , err )
@@ -126,12 +143,12 @@ func main() {
126143 os .Exit (exitOK )
127144}
128145
129- type actionFn func (io.Reader , io.Writer , bool ) (int , error )
146+ type actionFn func (io.Reader , io.Writer , int ) (int , error )
130147
131- func gron (r io.Reader , w io.Writer , monochrome bool ) (int , error ) {
148+ func gron (r io.Reader , w io.Writer , opts int ) (int , error ) {
132149
133150 formatter = colorFormatter {}
134- if monochrome {
151+ if opts & optMonochrome > 0 {
135152 formatter = monoFormatter {}
136153 }
137154
@@ -142,7 +159,9 @@ func gron(r io.Reader, w io.Writer, monochrome bool) (int, error) {
142159
143160 // Go's maps do not have well-defined ordering, but we want a consistent
144161 // output for a given input, so we must sort the statements
145- sort .Sort (ss )
162+ if opts & optNoSort == 0 {
163+ sort .Sort (ss )
164+ }
146165
147166 for _ , s := range ss {
148167 fmt .Fprintln (w , s )
@@ -151,7 +170,7 @@ func gron(r io.Reader, w io.Writer, monochrome bool) (int, error) {
151170 return exitOK , nil
152171}
153172
154- func ungron (r io.Reader , w io.Writer , monochrome bool ) (int , error ) {
173+ func ungron (r io.Reader , w io.Writer , opts int ) (int , error ) {
155174 scanner := bufio .NewScanner (r )
156175
157176 // Make a list of statements from the input
@@ -186,7 +205,7 @@ func ungron(r io.Reader, w io.Writer, monochrome bool) (int, error) {
186205 }
187206
188207 // If the output isn't monochrome, add color to the JSON
189- if ! monochrome {
208+ if opts & optMonochrome == 0 {
190209 c , err := colorizeJSON (j )
191210
192211 // If we failed to colorize the JSON for whatever reason,
0 commit comments