From 401e218ade6a7e40ce4f1154731a1f83d5f639b8 Mon Sep 17 00:00:00 2001 From: Will Scott Date: Thu, 13 May 2021 23:13:30 -0700 Subject: [PATCH] Add enumerate methods to the multicodec registries. (This is a logical port of https://github.com/ipld/go-ipld-prime/pull/169 to follow https://github.com/ipld/go-ipld-prime/pull/172 .) I've added more documentation -- particularly, cautionary notes on the package-scope functions which read the global shared state. --- multicodec/defaultRegistry.go | 32 ++++++++++++++++++++++++++++++++ multicodec/registry.go | 20 ++++++++++++++++++++ 2 files changed, 52 insertions(+) diff --git a/multicodec/defaultRegistry.go b/multicodec/defaultRegistry.go index 00868aa5..b81066a6 100644 --- a/multicodec/defaultRegistry.go +++ b/multicodec/defaultRegistry.go @@ -53,6 +53,22 @@ func LookupEncoder(indicator uint64) (ipld.Encoder, error) { return DefaultRegistry.LookupEncoder(indicator) } +// ListEncoders returns a list of multicodec indicators for which an ipld.Encoder is registered. +// The list is in no particular order. +// It is a shortcut to the ListEncoders method on the global DefaultRegistry. +// +// Be judicious about trying to use this function outside of debugging. +// Because the global default registry is global and easily modified, +// and can be changed by any of the transitive dependencies of your program, +// its contents are not particularly stable. +// In particular, it is not recommended to make any behaviors of your program conditional +// based on information returned by this function -- if your program needs conditional +// behavior based on registred codecs, you may want to consider taking more explicit control +// and using your own non-default registry. +func ListEncoders() []uint64 { + return DefaultRegistry.ListEncoders() +} + // RegisterDecoder updates the global DefaultRegistry a map a multicodec indicator number to the given ipld.Decoder function. // The decoder functions registered can be subsequently looked up using LookupDecoder. // It is a shortcut to the RegisterDecoder method on the global DefaultRegistry. @@ -83,3 +99,19 @@ func RegisterDecoder(indicator uint64, decodeFunc ipld.Decoder) { func LookupDecoder(indicator uint64) (ipld.Decoder, error) { return DefaultRegistry.LookupDecoder(indicator) } + +// ListDecoders returns a list of multicodec indicators for which an ipld.Decoder is registered. +// The list is in no particular order. +// It is a shortcut to the ListDecoders method on the global DefaultRegistry. +// +// Be judicious about trying to use this function outside of debugging. +// Because the global default registry is global and easily modified, +// and can be changed by any of the transitive dependencies of your program, +// its contents are not particularly stable. +// In particular, it is not recommended to make any behaviors of your program conditional +// based on information returned by this function -- if your program needs conditional +// behavior based on registred codecs, you may want to consider taking more explicit control +// and using your own non-default registry. +func ListDecoders() []uint64 { + return DefaultRegistry.ListDecoders() +} diff --git a/multicodec/registry.go b/multicodec/registry.go index fe7d608b..d829f7db 100644 --- a/multicodec/registry.go +++ b/multicodec/registry.go @@ -60,6 +60,16 @@ func (r *Registry) LookupEncoder(indicator uint64) (ipld.Encoder, error) { return encodeFunc, nil } +// ListEncoders returns a list of multicodec indicators for which an ipld.Encoder is registered. +// The list is in no particular order. +func (r *Registry) ListEncoders() []uint64 { + encoders := make([]uint64, 0, len(r.encoders)) + for e := range r.encoders { + encoders = append(encoders, e) + } + return encoders +} + // RegisterDecoder updates a simple map of multicodec indicator number to ipld.Decoder function. // The decoder functions registered can be subsequently looked up using LookupDecoder. func (r *Registry) RegisterDecoder(indicator uint64, decodeFunc ipld.Decoder) { @@ -81,3 +91,13 @@ func (r *Registry) LookupDecoder(indicator uint64) (ipld.Decoder, error) { } return decodeFunc, nil } + +// ListDecoders returns a list of multicodec indicators for which an ipld.Decoder is registered. +// The list is in no particular order. +func (r *Registry) ListDecoders() []uint64 { + decoders := make([]uint64, 0, len(r.decoders)) + for d := range r.decoders { + decoders = append(decoders, d) + } + return decoders +}