From e5b4fc6cc06b5063ee2f988836838257a045e46c Mon Sep 17 00:00:00 2001 From: Joshua Humphries Date: Wed, 22 May 2019 21:38:46 -0400 Subject: [PATCH] add API to expose AnyResolver implementations backed by a DescriptorSource (#102) --- format.go | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/format.go b/format.go index bd9116a..db93eb4 100644 --- a/format.go +++ b/format.go @@ -195,6 +195,22 @@ const ( FormatText = Format("text") ) +// AnyResolverFromDescriptorSource returns an AnyResolver that will search for +// types using the given descriptor source. +func AnyResolverFromDescriptorSource(source DescriptorSource) jsonpb.AnyResolver { + return &anyResolver{source: source} +} + +// AnyResolverFromDescriptorSourceWithFallback returns an AnyResolver that will +// search for types using the given descriptor source and then fallback to a +// special message if the type is not found. The fallback type will render to +// JSON with a "@type" property, just like an Any message, but also with a +// custom "@value" property that includes the binary encoded payload. +func AnyResolverFromDescriptorSourceWithFallback(source DescriptorSource) jsonpb.AnyResolver { + res := anyResolver{source: source} + return &anyResolverWithFallback{AnyResolver: &res} +} + type anyResolver struct { source DescriptorSource @@ -334,8 +350,8 @@ var _ proto.Message = (*unknownAny)(nil) func RequestParserAndFormatterFor(format Format, descSource DescriptorSource, emitJSONDefaultFields, includeTextSeparator bool, in io.Reader) (RequestParser, Formatter, error) { switch format { case FormatJSON: - resolver := anyResolver{source: descSource} - return NewJSONRequestParser(in, &resolver), NewJSONFormatter(emitJSONDefaultFields, anyResolverWithFallback{AnyResolver: &resolver}), nil + resolver := AnyResolverFromDescriptorSource(descSource) + return NewJSONRequestParser(in, resolver), NewJSONFormatter(emitJSONDefaultFields, anyResolverWithFallback{AnyResolver: resolver}), nil case FormatText: return NewTextRequestParser(in), NewTextFormatter(includeTextSeparator), nil default: