use_group_link.go 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. // package use_group_link -- группа связей в вариантах использования
  2. package use_group_link
  3. import (
  4. "fmt"
  5. "gitp78su.ipnodns.ru/svi/goarch/lev0/alias"
  6. "gitp78su.ipnodns.ru/svi/goarch/lev0/types"
  7. "gitp78su.ipnodns.ru/svi/goarch/lev1/coord"
  8. "gitp78su.ipnodns.ru/svi/goarch/lev1/offset"
  9. "gitp78su.ipnodns.ru/svi/goarch/pkg/elems/elem_base"
  10. )
  11. // UseGroupLink -- группа связей в вариантах использования
  12. type UseGroupLink struct {
  13. ElemBase_ *elem_base.ElemBase `yaml:"elem_base"`
  14. Links_ []alias.Id `yaml:"link"` // Связи объекта
  15. }
  16. // NewUseGroupLink -- возвращает новый группу связей в вариантах использования
  17. func NewUseGroupLink(elemBase *elem_base.ElemBase, id alias.Id, label_ alias.Label,
  18. labelCoord *coord.Coord, labelOffset *offset.Offset,
  19. type_ alias.Type, elem map[string]interface{}, binElem []byte) (*UseGroupLink, error) {
  20. _links0, isOk := elem["links"]
  21. if !isOk {
  22. return nil, fmt.Errorf("NewUseGroupLink(): id=%q, field `links` not found", id)
  23. }
  24. _links, isOk := _links0.([]interface{})
  25. if !isOk {
  26. return nil, fmt.Errorf("NewUseGroupLink(): id=%q, field `links`(%T, %+v) not []interface{}", id, _links0, _links0)
  27. }
  28. var links []alias.Id
  29. for _, _id := range _links {
  30. id0, isOk := _id.(string)
  31. if !isOk {
  32. return nil, fmt.Errorf("NewUseGroupLink(): id=%q, field `links`(%T, %+v) not string", id, _id, _id)
  33. }
  34. id1 := alias.Id(id0)
  35. if id1 == "" {
  36. return nil, fmt.Errorf("NewUseGroupLink(): id=%q, link=%q is empty", id, _id)
  37. }
  38. links = append(links, id1)
  39. }
  40. sf := &UseGroupLink{
  41. ElemBase_: elemBase,
  42. Links_: links,
  43. }
  44. return sf, nil
  45. }
  46. // Check -- проверяет ошибки связей
  47. func (sf *UseGroupLink) Check(mapElem map[alias.Id]types.IDrawer) string {
  48. var msgErr string
  49. if len(sf.Links_) == 0 {
  50. msgErr = "Список ссылок(links) пуст\n"
  51. }
  52. // Проверить, что ссылки реально существует
  53. for _, id := range sf.Links_ {
  54. link, ok := mapElem[id]
  55. if !ok {
  56. msgErr += fmt.Sprintf("UseGroupLink.Check(): ссылка %q не существует\n", id)
  57. continue
  58. }
  59. ln, isOk := link.(types.IElemLinker)
  60. if !isOk {
  61. msgErr += fmt.Sprintf("UseGroupLink.Check(): ссылка %q не ILinker\n", id)
  62. continue
  63. }
  64. if !(ln.SrcId() == sf.ElemBase_.Id_ || ln.DstId() == sf.ElemBase_.Id_) {
  65. msgErr += fmt.Sprintf("UseGroupLink.Check(): ссылка %q не взаимная\n", id)
  66. continue
  67. }
  68. }
  69. return msgErr
  70. }
  71. // Links -- ссылки вариантов использования
  72. func (sf *UseGroupLink) Links() []alias.Id {
  73. return sf.Links_
  74. }