]> Sergey Matveev's repositories - btrtrc.git/commitdiff
cmd/torrent: Add bencode {json,spew} commands
authorMatt Joiner <anacrolix@gmail.com>
Wed, 3 Nov 2021 02:49:06 +0000 (13:49 +1100)
committerMatt Joiner <anacrolix@gmail.com>
Wed, 3 Nov 2021 02:49:06 +0000 (13:49 +1100)
cmd/torrent/main.go
go.mod
go.sum

index 50604cf689a66922cec489cf2830325ab09797d5..b5ca03beda9e9ca83d6d757306ceb0824a43ce68 100644 (file)
@@ -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 a00591869b5b2c995889875a5e090286704c2728..d1bf7c9d1cdc53570713fe12933180effb1d404a 100644 (file)
--- 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 4ed7c1cbed651aa24ac644d87af2777db0c0b165..3cedfcf5c57bb44bfe78acbfa0bbc64aedc76372 100644 (file)
--- 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=