github.com/voedger/voedger@v0.0.0-20240520144910-273e84102129/pkg/istructsmem/internal/descr/impl_structure.go (about) 1 /* 2 * Copyright (c) 2021-present Sigma-Soft, Ltd. 3 * @author: Nikolay Nikitin 4 */ 5 6 package descr 7 8 import ( 9 "github.com/voedger/voedger/pkg/appdef" 10 ) 11 12 func newStructure() *Structure { 13 return &Structure{ 14 Fields: make([]*Field, 0), 15 Containers: make([]*Container, 0), 16 Uniques: make(map[string]*Unique), 17 } 18 } 19 20 func (s *Structure) read(str appdef.IStructure) { 21 s.Type.read(str) 22 23 s.Kind = str.Kind().TrimString() 24 25 for _, fld := range str.Fields() { 26 f := newField() 27 f.read(fld) 28 s.Fields = append(s.Fields, f) 29 } 30 31 for _, cont := range str.Containers() { 32 c := newContainer() 33 c.read(cont) 34 s.Containers = append(s.Containers, c) 35 } 36 37 for n, unique := range str.Uniques() { 38 u := newUnique() 39 u.read(unique) 40 s.Uniques[n.String()] = u 41 } 42 if uf := str.UniqueField(); uf != nil { 43 s.UniqueField = uf.Name() 44 } 45 46 if singleton, ok := str.(appdef.ISingleton); ok { 47 if singleton.Singleton() { 48 s.Singleton = true 49 } 50 } 51 } 52 53 func newField() *Field { return &Field{} } 54 55 func (f *Field) read(field appdef.IField) { 56 f.Comment = readComment(field) 57 58 f.Name = field.Name() 59 if q := field.Data().QName(); q != appdef.NullQName { 60 f.Data = &q 61 } else { 62 f.DataType = newData() 63 f.DataType.read(field.Data()) 64 } 65 f.Required = field.Required() 66 f.Verifiable = field.Verifiable() 67 if ref, ok := field.(appdef.IRefField); ok { 68 for _, r := range ref.Refs() { 69 f.Refs = append(f.Refs, r.String()) 70 } 71 } 72 } 73 74 func newContainer() *Container { return &Container{} } 75 76 func (c *Container) read(cont appdef.IContainer) { 77 c.Comment = readComment(cont) 78 79 c.Name = cont.Name() 80 c.Type = cont.QName() 81 c.MinOccurs = cont.MinOccurs() 82 c.MaxOccurs = cont.MaxOccurs() 83 } 84 85 func newUnique() *Unique { return &Unique{} } 86 87 func (u *Unique) read(unique appdef.IUnique) { 88 u.Comment = readComment(unique) 89 90 u.Name = unique.Name() 91 for _, f := range unique.Fields() { 92 u.Fields = append(u.Fields, f.Name()) 93 } 94 }