did
is a Go package that provides tools to work with
Decentralized Identifiers (DIDs).
go get github.com/ockam-network/did
package main
import (
"fmt"
"log"
"github.com/ockam-network/did"
)
func main() {
d, err := did.Parse("did:example:q7ckgxeq1lxmra0r")
if err != nil {
log.Fatal(err)
}
fmt.Printf("%#v", d)
}
The above example parses the input string according to the rules defined in the DID Grammar and prints the following value of DID type.
&did.DID{
Method:"example",
ID:"q7ckgxeq1lxmra0r",
IDStrings:[]string{"q7ckgxeq1lxmra0r"},
Path:"",
PathSegments:[]string(nil),
Query:"",
Fragment:""
}
The input string may also be a DID Reference with a DID Path:
d, err := did.Parse("did:example:q7ckgxeq1lxmra0r/abc/pqr")
which would result in:
&did.DID{
Method:"example",
ID:"q7ckgxeq1lxmra0r",
IDStrings:[]string{"q7ckgxeq1lxmra0r"},
Path:"abc/pqr",
PathSegments:[]string{"abc", "pqr"},
Query:"",
Fragment:""
}
or a DID Reference with a DID Path and a DID Query:
d, err := did.Parse("did:example:q7ckgxeq1lxmra0r/abc/pqr?xyz")
fmt.Println(d.Query)
// Output: xyz
or a DID Reference with a DID Fragment:
d, err := did.Parse("did:example:q7ckgxeq1lxmra0r#keys-1")
fmt.Println(d.Fragment)
// Output: keys-1
This package also implements the Stringer interface for the DID type. It is easy to convert DID type structures into valid DID strings:
d := &did.DID{Method: "example", ID: "q7ckgxeq1lxmra0r"}
fmt.Println(d.String())
// Output: did:example:q7ckgxeq1lxmra0r
or with a refence with a fragment:
d := &did.DID{Method: "example", ID: "q7ckgxeq1lxmra0r", Fragment: "keys-1"}
fmt.Println(d.String())
// Output: did:example:q7ckgxeq1lxmra0r#keys-1
For more documentation and examples, please see godoc.
To compile the code in this repository, run:
go build
This repository includes a comprehensive suite of tests that check for various edge cases within the DID Grammar.
To run the tests, run:
go test -v -cover
We haven't spent any time tuning the performance of the parser, however this repository includes some
benchmarks that compare the speed of did.Parse
against Go's url.Parse
with inputs
of similar length, this is intended as a sanity check to ensure that did.Parse
is at least comparable in performance
to url.Parse
go test -bench=.
did.Parse
included in this package:
BenchmarkParse-8 5000000 365 ns/op
BenchmarkParseWithPath-8 3000000 500 ns/op
BenchmarkParseWithQuery-8 3000000 558 ns/op
BenchmarkParseWithFragment-8 3000000 552 ns/op
Go's url.Parse
:
BenchmarkUrlParse-8 3000000 475 ns/op
BenchmarkUrlParseWithPath-8 3000000 505 ns/op
BenchmarkUrlParseWithQuery-8 5000000 294 ns/op
BenchmarkUrlParseWithFragment-8 5000000 369 ns/op
This package is early in its development and we welcome all contributions from the DID community. Please open issues and send pull requests.
We follow the conventions specified in Conventional Commits for our commit messages.
This package is licensed under Apache License 2.0.