From: Matt Joiner Date: Wed, 3 Nov 2021 02:49:06 +0000 (+1100) Subject: cmd/torrent: Add bencode {json,spew} commands X-Git-Tag: v1.36.0~7 X-Git-Url: http://www.git.stargrave.org/?a=commitdiff_plain;h=002de0ebe3086851a5f2a2e7ae84c68d46079ca0;p=btrtrc.git cmd/torrent: Add bencode {json,spew} commands --- diff --git a/cmd/torrent/main.go b/cmd/torrent/main.go index 50604cf6..b5ca03be 100644 --- a/cmd/torrent/main.go +++ b/cmd/torrent/main.go @@ -2,6 +2,7 @@ package main import ( + "encoding/json" "errors" "expvar" "fmt" @@ -254,20 +255,46 @@ func mainErr() error { return nil }), args.Subcommand( - "spew-bencoding", + "bencode", func(p args.SubCmdCtx) error { + var print func(interface{}) error + if !p.Parse( + args.Subcommand("json", func(ctx args.SubCmdCtx) (err error) { + ctx.Parse() + je := json.NewEncoder(os.Stdout) + je.SetIndent("", " ") + print = je.Encode + return nil + }), + args.Subcommand("spew", func(ctx args.SubCmdCtx) (err error) { + ctx.Parse() + config := spew.NewDefaultConfig() + config.DisableCapacities = true + config.Indent = " " + print = func(v interface{}) error { + config.Dump(v) + return nil + } + return nil + }), + ).RanSubCmd { + return errors.New("an output type is required") + } d := bencode.NewDecoder(os.Stdin) - for i := 0; ; i++ { - var v interface{} - err := d.Decode(&v) - if err == io.EOF { - break - } - if err != nil { - return fmt.Errorf("decoding message index %d: %w", i, err) + p.Defer(func() error { + for i := 0; ; i++ { + var v interface{} + err := d.Decode(&v) + if err == io.EOF { + break + } + if err != nil { + return fmt.Errorf("decoding message index %d: %w", i, err) + } + print(v) } - spew.Dump(v) - } + return nil + }) return nil }, args.Help("reads bencoding from stdin into Go native types and spews the result"), diff --git a/go.mod b/go.mod index a0059186..d1bf7c9d 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ require ( crawshaw.io/sqlite v0.3.3-0.20210127221821-98b1f83c5508 github.com/RoaringBitmap/roaring v0.9.4 github.com/alexflint/go-arg v1.4.2 - github.com/anacrolix/args v0.1.1-0.20211020052733-53ed238acbd4 + github.com/anacrolix/args v0.3.0 github.com/anacrolix/chansync v0.3.0-0.0.20211007004133-3f72684c4a93 github.com/anacrolix/confluence v1.8.0 // indirect github.com/anacrolix/dht/v2 v2.10.6-0.20211007004332-99263ec9c1c8 diff --git a/go.sum b/go.sum index 4ed7c1cb..3cedfcf5 100644 --- a/go.sum +++ b/go.sum @@ -44,8 +44,10 @@ github.com/alexflint/go-arg v1.4.2/go.mod h1:9iRbDxne7LcR/GSvEr7ma++GLpdIU1zrghf github.com/alexflint/go-scalar v1.0.0/go.mod h1:GpHzbCOZXEKMEcygYQ5n/aa4Aq84zbxjy3MxYW0gjYw= github.com/alexflint/go-scalar v1.1.0 h1:aaAouLLzI9TChcPXotr6gUhq+Scr8rl0P9P4PnltbhM= github.com/alexflint/go-scalar v1.1.0/go.mod h1:LoFvNMqS1CPrMVltza4LvnGKhaSpc3oyLEBUZVhhS2o= -github.com/anacrolix/args v0.1.1-0.20211020052733-53ed238acbd4 h1:s6KNsoIo4VlU5fqoTVczWqDyM163HzyqoPY0hQJS+9U= -github.com/anacrolix/args v0.1.1-0.20211020052733-53ed238acbd4/go.mod h1:41JBnF8sKExNVLHPkCdL74jkZc3dSxAkGsk1TuKOUFI= +github.com/anacrolix/args v0.2.1-0.20211103024302-00380c7cbbec h1:gHr2HG2wRaEQkoDif7ic59iQZsEBeWfa6j+4I4Obj+8= +github.com/anacrolix/args v0.2.1-0.20211103024302-00380c7cbbec/go.mod h1:41JBnF8sKExNVLHPkCdL74jkZc3dSxAkGsk1TuKOUFI= +github.com/anacrolix/args v0.3.0 h1:rM2/mjp0b+JXvv5emEL9jm0uBAa8+380iihM3Ynhm0E= +github.com/anacrolix/args v0.3.0/go.mod h1:41JBnF8sKExNVLHPkCdL74jkZc3dSxAkGsk1TuKOUFI= github.com/anacrolix/chansync v0.0.0-20210524073341-a336ebc2de92/go.mod h1:DZsatdsdXxD0WiwcGl0nJVwyjCKMDv+knl1q2iBjA2k= github.com/anacrolix/chansync v0.3.0-0.0.20211007004133-3f72684c4a93 h1:sQ8igc3anitrtKPEHRK+RBvuNZP0+DRAa6jskKlq4+k= github.com/anacrolix/chansync v0.3.0-0.0.20211007004133-3f72684c4a93/go.mod h1:DZsatdsdXxD0WiwcGl0nJVwyjCKMDv+knl1q2iBjA2k=