@@ -26,6 +26,7 @@ type marshalState struct {
2626 schemaComments bool
2727 seenStructs map [reflect.Type ]bool
2828 allowExtra bool
29+ defaultTransformer func (string ) string
2930}
3031
3132// Create a shallow clone with schema overridden.
@@ -84,6 +85,13 @@ func WithSchemaComments(v bool) MarshalOption {
8485 }
8586}
8687
88+ // WithDefaultTransformer allows custom processing of default values in struct tags.
89+ func WithDefaultTransformer (transformer func (string ) string ) MarshalOption {
90+ return func (options * marshalState ) {
91+ options .defaultTransformer = transformer
92+ }
93+ }
94+
8795func asSchema () MarshalOption {
8896 return func (options * marshalState ) {
8997 options .schema = true
@@ -264,33 +272,33 @@ func fieldToAttr(field field, tag tag, opt *marshalState) (*Attribute, error) {
264272 if err != nil {
265273 return nil , err
266274 }
267- attr .Default , err = defaultValueFromTag (field , tag .defaultValue )
275+ attr .Default , err = defaultValueFromTag (field , tag .defaultValue , opt )
268276 if err != nil {
269277 return nil , err
270278 }
271279 attr .Optional = (tag .optional || attr .Default != nil ) && opt .schema
272- attr .Enum , err = enumValuesFromTag (field , tag .enum )
280+ attr .Enum , err = enumValuesFromTag (field , tag .enum , opt )
273281 return attr , err
274282}
275283
276- func defaultValueFromTag (f field , defaultValue string ) (Value , error ) {
277- v , err := valueFromTag (f , defaultValue )
284+ func defaultValueFromTag (f field , defaultValue string , opt * marshalState ) (Value , error ) {
285+ v , err := valueFromTag (f , defaultValue , opt )
278286 if err != nil {
279287 return nil , fmt .Errorf ("error parsing default value: %v" , err )
280288 }
281289 return v , nil
282290}
283291
284292// enumValuesFromTag parses the enum string from tag into a list of Values
285- func enumValuesFromTag (f field , enum string ) ([]Value , error ) {
293+ func enumValuesFromTag (f field , enum string , opt * marshalState ) ([]Value , error ) {
286294 if enum == "" {
287295 return nil , nil
288296 }
289297
290298 enums := strings .Split (enum , "," )
291299 list := make ([]Value , 0 , len (enums ))
292300 for _ , e := range enums {
293- enumVal , err := valueFromTag (f , e )
301+ enumVal , err := valueFromTag (f , e , opt )
294302 if err != nil {
295303 return nil , fmt .Errorf ("error parsing enum: %v" , err )
296304 }
@@ -302,11 +310,15 @@ func enumValuesFromTag(f field, enum string) ([]Value, error) {
302310
303311}
304312
305- func valueFromTag (f field , defaultValue string ) (Value , error ) {
313+ func valueFromTag (f field , defaultValue string , opt * marshalState ) (Value , error ) {
306314 if defaultValue == "" {
307315 return nil , nil // nolint: nilnil
308316 }
309317
318+ if opt != nil && opt .defaultTransformer != nil {
319+ defaultValue = opt .defaultTransformer (defaultValue )
320+ }
321+
310322 k := f .v .Kind ()
311323 if k == reflect .Ptr {
312324 k = f .v .Type ().Elem ().Kind ()
@@ -372,7 +384,7 @@ func valueFromTag(f field, defaultValue string) (Value, error) {
372384 t : reflect.StructField {},
373385 v : reflect .New (valueType ),
374386 }
375- val , err := defaultValueFromTag (valueField , v )
387+ val , err := defaultValueFromTag (valueField , v , opt )
376388 if err != nil {
377389 return nil , fmt .Errorf ("error parsing map %q into value, %v" , v , err )
378390 }
@@ -406,7 +418,7 @@ func valueFromTag(f field, defaultValue string) (Value, error) {
406418 v : reflect .New (valueType ),
407419 }
408420 for _ , item := range list {
409- value , err := defaultValueFromTag (valueField , item )
421+ value , err := defaultValueFromTag (valueField , item , opt )
410422 if err != nil {
411423 return nil , fmt .Errorf ("error applying %q to list: %v" , item , err )
412424 }
0 commit comments