// ------------------------------------------------------------------------ // Project active2 // Active Thing (activething.com) git.activething.com/go // // File name text_formatter.go // Created by DEV // Modified 22/04/2024 // // Copyright 2024 activething.com // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ package ertext import ( "errs/stack" "typs/strs" ) type ( TextEncoder struct { Option layout Layout sections Sections nameTrans strs.Transformers valueTrans strs.Transformers onFormatError ErrorFallbackFnc onTraceError ErrorFallbackFnc onCauseError ErrorFallbackFnc frameBuilder func (builder *TextBuilder, frame stack.Frame, num int) } TextEncoderFnc func (formatter *TextEncoder) ) func NewTextEncoder(options ...TextEncoderFnc) *TextEncoder { fm := &TextEncoder{ Option : optionsDefault, layout : *newLayouts(), frameBuilder : defaultFrameBuilder, onFormatError : defaultFallback, onTraceError : defaultFallback, onCauseError : defaultFallback, } for _,o := range options { o(fm) } return fm } func (f *TextEncoder) EncodeError(err error) []byte { if err == nil { return nil } b := newTextBuilder(f) defer func(tb *TextBuilder){ tb.reset() }(b) b.format(err) return b.b.Bytes() } func WithErrorFallbacks (format, cause, trace ErrorFallbackFnc) TextEncoderFnc { return func(f *TextEncoder) { if format == nil { f.onFormatError = format } if cause == nil { f.onCauseError = cause } if trace == nil { f.onTraceError = trace } } } func WithOptions (set, unset Option) TextEncoderFnc { return func(f *TextEncoder) { f.Option = f.Option.Add(set) f.Option = f.Option.Del(unset) } } func WithNameTransformers(transformer ...strs.Transformer) TextEncoderFnc { return func(f *TextEncoder) { f.nameTrans = append(f.nameTrans, transformer ...) } } func WithValueTransformers(transformer ...strs.Transformer) TextEncoderFnc { return func(f *TextEncoder) { f.valueTrans = append(f.nameTrans, transformer ...) } } func WithSectionsFormat(config SectionsFnc) TextEncoderFnc { return func(f *TextEncoder) { config(&f.sections) } } func WithLayouts (config LayoutFnc) TextEncoderFnc { return func(f *TextEncoder) { config(&f.layout) } } func WithFrameBuilder (builderFn func (builder *TextBuilder, frame stack.Frame, num int)) TextEncoderFnc { return func(f *TextEncoder) { f.frameBuilder = builderFn } }