11package main
22
33import (
4+ "bufio"
45 "fmt"
6+ "io"
57 "os"
68 "strings"
79
@@ -12,7 +14,9 @@ import (
1214)
1315
1416func usage () {
15- fmt .Fprintf (os .Stderr , "usage: %s [-b multibase-code] [-v cid-version] <fmt-str> <cid> ...\n \n " , os .Args [0 ])
17+ fmt .Fprintf (os .Stderr , "usage: %s [-b multibase-code] [-v cid-version] [--filter] <fmt-str> <cid> ...\n " , os .Args [0 ])
18+ fmt .Fprintf (os .Stderr , "--filter will read from stdin and convert anything that looks like a <cid>\n " )
19+ fmt .Fprintf (os .Stderr , " -- including any non-cids that are valid Multihashes).\n " )
1620 fmt .Fprintf (os .Stderr , "<fmt-str> is either 'prefix' or a printf style format string:\n %s" , cidutil .FormatRef )
1721 os .Exit (2 )
1822}
@@ -24,8 +28,9 @@ func main() {
2428 newBase := mb .Encoding (- 1 )
2529 var verConv func (cid c.Cid ) (c.Cid , error )
2630 args := os .Args [1 :]
31+ filter := false
2732outer:
28- for {
33+ for len ( args ) > 0 {
2934 switch args [0 ] {
3035 case "-b" :
3136 if len (args ) < 2 {
@@ -52,11 +57,14 @@ outer:
5257 os .Exit (2 )
5358 }
5459 args = args [2 :]
60+ case "--filter" :
61+ filter = true
62+ args = args [1 :]
5563 default :
5664 break outer
5765 }
5866 }
59- if len (args ) < 2 {
67+ if len (args ) < 1 {
6068 usage ()
6169 }
6270 fmtStr := args [0 ]
@@ -69,41 +77,73 @@ outer:
6977 os .Exit (2 )
7078 }
7179 }
72- for _ , cidStr := range args [1 :] {
73- cid , err := c .Decode (cidStr )
74- if err != nil {
75- fmt .Fprintf (os .Stdout , "!INVALID_CID!\n " )
76- errorMsg ("%s: %v" , cidStr , err )
77- // Don't abort on a bad cid
78- continue
79- }
80+ format := func (cid c.Cid , cidStr string ) (string , error ) {
8081 base := newBase
81- if newBase == - 1 {
82+ if base == - 1 {
8283 base , _ = c .ExtractEncoding (cidStr )
8384 }
85+ var err error
8486 if verConv != nil {
8587 cid , err = verConv (cid )
8688 if err != nil {
87- fmt .Fprintf (os .Stdout , "!ERROR!\n " )
88- errorMsg ("%s: %v" , cidStr , err )
89- // Don't abort on a bad conversion
90- continue
89+ return "" , err
90+ }
91+ }
92+ return cidutil .Format (fmtStr , base , cid )
93+ }
94+ if filter {
95+ scanner := bufio .NewScanner (os .Stdin )
96+ for scanner .Scan () {
97+ buf := scanner .Bytes ()
98+ for {
99+ i , j , cid , cidStr := cidutil .ScanForCid (buf )
100+ os .Stdout .Write (buf [0 :i ])
101+ if i == len (buf ) {
102+ os .Stdout .Write ([]byte {'\n' })
103+ break
104+ }
105+ str , err := format (cid , cidStr )
106+ switch err .(type ) {
107+ case cidutil.FormatStringError :
108+ fmt .Fprintf (os .Stderr , "Error: %v\n " , err )
109+ os .Exit (2 )
110+ default :
111+ // just use the orignal sting on non-fatal error
112+ str = cidStr
113+ case nil :
114+ }
115+ io .WriteString (os .Stdout , str )
116+ buf = buf [j :]
91117 }
92118 }
93- str , err := cidutil .Format (fmtStr , base , cid )
94- switch err .(type ) {
95- case cidutil.FormatStringError :
119+ if err := scanner .Err (); err != nil {
96120 fmt .Fprintf (os .Stderr , "Error: %v\n " , err )
97121 os .Exit (2 )
98- default :
99- fmt .Fprintf (os .Stdout , "!ERROR!\n " )
100- errorMsg ("%s: %v" , cidStr , err )
101- // Don't abort on cid specific errors
102- continue
103- case nil :
104- // no error
105122 }
106- fmt .Fprintf (os .Stdout , "%s\n " , str )
123+ } else {
124+ for _ , cidStr := range args [1 :] {
125+ cid , err := c .Decode (cidStr )
126+ if err != nil {
127+ fmt .Fprintf (os .Stdout , "!INVALID_CID!\n " )
128+ errorMsg ("%s: %v" , cidStr , err )
129+ // Don't abort on a bad cid
130+ continue
131+ }
132+ str , err := format (cid , cidStr )
133+ switch err .(type ) {
134+ case cidutil.FormatStringError :
135+ fmt .Fprintf (os .Stderr , "Error: %v\n " , err )
136+ os .Exit (2 )
137+ default :
138+ fmt .Fprintf (os .Stdout , "!ERROR!\n " )
139+ errorMsg ("%s: %v" , cidStr , err )
140+ // Don't abort on cid specific errors
141+ continue
142+ case nil :
143+ // no error
144+ }
145+ fmt .Fprintf (os .Stdout , "%s\n " , str )
146+ }
107147 }
108148 os .Exit (exitCode )
109149}
0 commit comments