github.com/metux/go-metabuild@v0.0.0-20240118143255-d9ed5ab697f9/util/specobj/copy.go (about)

     1  package specobj
     2  
     3  import (
     4  	"fmt"
     5  
     6  	magic "github.com/metux/go-magicdict"
     7  	"github.com/metux/go-magicdict/api"
     8  
     9  	"github.com/metux/go-metabuild/util"
    10  )
    11  
    12  func (so SpecObj) copyDefaultsListFrom(src SpecObj, ent Entry, k Key) error {
    13  	dflt, err := magic.EntryMakeList(so.Spec, k.MagicDefaults())
    14  	util.ErrPanicf(err, "MakeList failed")
    15  
    16  	for _, idx := range ent.Keys() {
    17  		if e1, _ := ent.Get(idx); e1 != nil {
    18  			if e1.IsScalar() {
    19  				util.ErrPanicf(magic.EntryPutStr(dflt, idx, e1.String()), "adding scalar failed")
    20  			} else if e1.IsList() {
    21  				sublist, err3 := api.MakeList(dflt, idx)
    22  				if sublist == nil || err != nil {
    23  					panic(fmt.Sprintf("adding subdict failed, err=%s", err3))
    24  				}
    25  				so.EntrySpec(k.Append(idx)).CopyDefaultsFrom(src.EntrySpec(k.Append(idx)))
    26  			} else if e1.IsDict() {
    27  				subdict, err3 := api.MakeDict(dflt, idx)
    28  				if subdict == nil || err != nil {
    29  					panic(fmt.Sprintf("adding subdict failed, err=%s", err3))
    30  				}
    31  				so.EntrySpec(k.Append(idx)).CopyDefaultsFrom(src.EntrySpec(k.Append(idx)))
    32  			}
    33  		}
    34  	}
    35  	return nil
    36  }
    37  
    38  func (so SpecObj) CopyDefaultsFrom(src SpecObj) error {
    39  	for _, k := range src.Spec.Keys() {
    40  		if ent := magic.EntryGet(src.Spec, k); ent != nil {
    41  			if ent.IsScalar() {
    42  				so.DefaultPutStr(k, ent.String())
    43  			} else if ent.IsList() {
    44  				so.copyDefaultsListFrom(src, ent, k)
    45  			} else if ent.IsDict() {
    46  				so.EntrySpec(k).CopyDefaultsFrom(src.EntrySpec(k))
    47  			}
    48  		}
    49  	}
    50  	return nil
    51  }