diff --git a/lego/utils/codec/factory/factory_map.go b/lego/utils/codec/factory/factory_map.go index fe70437bb..eac42c436 100644 --- a/lego/utils/codec/factory/factory_map.go +++ b/lego/utils/codec/factory/factory_map.go @@ -134,6 +134,47 @@ func (encoder *sortKeysMapEncoder) Encode(ptr unsafe.Pointer, w codecore.IWriter w.PutReader(subIter) } +func (this *sortKeysMapEncoder) EncodeToMapJson(ptr unsafe.Pointer, w codecore.IWriter) (ret map[string]string, err error) { + ret = make(map[string]string) + var ( + k, v string + ) + keystream := w.GetWriter() + elemstream := w.GetWriter() + defer func() { + w.PutWriter(keystream) + w.PutWriter(elemstream) + }() + iter := this.mapType.UnsafeIterate(ptr) + for i := 0; iter.HasNext(); i++ { + key, elem := iter.UnsafeNext() + if this.keyEncoder.GetType() != reflect.String { + this.keyEncoder.Encode(key, keystream) + if keystream.Error() != nil && keystream.Error() != io.EOF { + err = keystream.Error() + return + } + k = BytesToString(keystream.Buffer()) + } else { + k = *((*string)(key)) + } + if this.elemEncoder.GetType() != reflect.String { + this.elemEncoder.Encode(elem, elemstream) + if elemstream.Error() != nil && elemstream.Error() != io.EOF { + err = elemstream.Error() + return + } + v = BytesToString(elemstream.Buffer()) + } else { + v = *((*string)(elem)) + } + ret[k] = v + keystream.Reset() + elemstream.Reset() + } + return +} + func (encoder *sortKeysMapEncoder) IsEmpty(ptr unsafe.Pointer) bool { iter := encoder.mapType.UnsafeIterate(ptr) return !iter.HasNext()