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  }