diff --git a/.gitignore b/.gitignore index 1d74e21..699d271 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ .vscode/ +multiaddr/multiaddr +tmp/ diff --git a/.travis.yml b/.travis.yml index 18f4287..eb31ba8 100644 --- a/.travis.yml +++ b/.travis.yml @@ -20,7 +20,7 @@ install: script: - bash <(curl -s https://raw.githubusercontent.com/ipfs/ci-helpers/master/travis-ci/run-standard-tests.sh) - + - make conformance cache: directories: diff --git a/Makefile b/Makefile index 9eb5c44..352cde4 100644 --- a/Makefile +++ b/Makefile @@ -12,3 +12,18 @@ deps: gx covertools publish: gx-go rewrite --undo +conformance: tmp/multiaddr + go get -d -v . + go build -o tmp/multiaddr/test/go-multiaddr ./multiaddr + cd tmp/multiaddr/test && MULTIADDR_BIN="./go-multiaddr" go test -v + +tmp/multiaddr: + mkdir -p tmp/ + git clone https://github.com/multiformats/multiaddr tmp/multiaddr/ + # TODO(lgierth): drop this once multiaddr test suite is merged + git --work-tree=tmp/multiaddr/ --git-dir=tmp/multiaddr/.git checkout feat/test + +clean: + rm -rf tmp/ + +.PHONY: gx covertools deps publish conformance clean diff --git a/codecov.yml b/codecov.yml new file mode 100644 index 0000000..ca8100a --- /dev/null +++ b/codecov.yml @@ -0,0 +1,2 @@ +ignore: + - "multiaddr" diff --git a/multiaddr/main.go b/multiaddr/main.go new file mode 100644 index 0000000..91c2597 --- /dev/null +++ b/multiaddr/main.go @@ -0,0 +1,93 @@ +package main + +import ( + "encoding/hex" + "flag" + "fmt" + "os" + "strings" + + maddr "github.com/multiformats/go-multiaddr" +) + +var ( + flagHelp bool +) + +func main() { + flag.Usage = func() { + usage := `usage: %s [options] ADDR + +Print details about the given multiaddr. + +Options: +` + fmt.Fprintf(os.Stderr, usage, os.Args[0]) + flag.PrintDefaults() + } + + flag.BoolVar(&flagHelp, "h", false, "display help message") + flag.Parse() + + if flagHelp || len(flag.Args()) == 0 { + flag.Usage() + os.Exit(0) + } + + addrStr := flag.Args()[0] + var addr maddr.Multiaddr + var err error + if strings.HasPrefix(addrStr, "0x") { + addrBytes, err := hex.DecodeString(addrStr[2:]) + if err != nil { + fmt.Fprintf(os.Stderr, "parse error: %s\n", err) + os.Exit(1) + } + addr, err = maddr.NewMultiaddrBytes(addrBytes) + } else { + addr, err = maddr.NewMultiaddr(addrStr) + } + if err != nil { + fmt.Fprintf(os.Stderr, "parse error: %s\n", err) + os.Exit(1) + } + + infoCommand(addr) +} + +func infoCommand(addr maddr.Multiaddr) { + var compsJson []string + maddr.ForEach(addr, func(comp maddr.Component) bool { + lengthPrefix := "" + if comp.Protocol().Size == maddr.LengthPrefixedVarSize { + lengthPrefix = "0x" + hex.EncodeToString(maddr.CodeToVarint(len(comp.RawValue()))) + } + + compsJson = append(compsJson, `{`+ + fmt.Sprintf(`"string": "%s", `, comp.String())+ + fmt.Sprintf(`"stringSize": "%d", `, len(comp.String()))+ + fmt.Sprintf(`"packed": "0x%x", `, comp.Bytes())+ + fmt.Sprintf(`"packedSize": "%d", `, len(comp.Bytes()))+ + fmt.Sprintf(`"value": %#v, `, comp.Value())+ + fmt.Sprintf(`"rawValue": "0x%x", `, comp.RawValue())+ + fmt.Sprintf(`"valueSize": "%d", `, len(comp.RawValue()))+ + fmt.Sprintf(`"protocol": "%s", `, comp.Protocol().Name)+ + fmt.Sprintf(`"codec": "%d", `, comp.Protocol().Code)+ + fmt.Sprintf(`"uvarint": "0x%x", `, comp.Protocol().VCode)+ + fmt.Sprintf(`"lengthPrefix": "%s"`, lengthPrefix)+ + `}`) + return true + }) + + addrJson := `{ + "string": "%[1]s", + "stringSize": "%[2]d", + "packed": "0x%[3]x", + "packedSize": "%[4]d", + "components": [ + %[5]s + ] +}` + fmt.Fprintf(os.Stdout, addrJson+"\n", + addr.String(), len(addr.String()), addr.Bytes(), len(addr.Bytes()), strings.Join(compsJson, ",\n ")) +}