diff --git a/multicodec/defaultRegistry.go b/multicodec/defaultRegistry.go index 00868aa5cd95f632476f3490694799a6b8f3e25c..b81066a6eacecdefc965e5d4213dd24e31d3094b 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 fe7d608b1fd9e600c38f0211fc89d0eb359c94cd..d829f7db2ef0a97c39cf5e18d477fa76db72eb85 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 +}