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 }