arch_group_link.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. // package arch_group_link -- группа связей
  2. package arch_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/arch_node"
  8. "gitp78su.ipnodns.ru/svi/goarch/lev1/view_coord"
  9. "gitp78su.ipnodns.ru/svi/goarch/lev1/view_offset"
  10. )
  11. // ArchGroupLink -- группа связей
  12. type ArchGroupLink struct {
  13. *arch_node.ArchNode
  14. Links_ []alias.ArchId `yaml:"link"` // Связи объекта
  15. }
  16. // NewUseGroupLink -- возвращает новый группу связей в вариантах использования
  17. func NewUseGroupLink(elemBase *arch_node.ArchNode, id alias.ArchId, label_ alias.ArchText,
  18. labelCoord *view_coord.ViewCoord, labelOffset *view_offset.Offset,
  19. type_ alias.ArchType, elem map[string]interface{}, binElem []byte) (*ArchGroupLink, 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.ArchId
  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.ArchId(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 := &ArchGroupLink{
  41. ArchNode: elemBase,
  42. Links_: links,
  43. }
  44. return sf, nil
  45. }
  46. // Check -- проверяет ошибки связей
  47. func (sf *ArchGroupLink) Check(mapElem types.IViewTree) string {
  48. var msgErr string
  49. if len(sf.Links_) == 0 {
  50. msgErr = "Список ссылок(links) пуст\n"
  51. }
  52. // Проверить, что ссылки реально существует
  53. for _, id := range sf.Links_ {
  54. resDrawer := mapElem.Get(id)
  55. if resDrawer.IsErr() {
  56. msgErr += fmt.Sprintf("UseGroupLink.Check(): ссылка %q не существует\n", id)
  57. continue
  58. }
  59. link := resDrawer.Val()
  60. ln, isOk := link.(types.IArchLink)
  61. if !isOk {
  62. msgErr += fmt.Sprintf("UseGroupLink.Check(): ссылка %q не ILinker\n", id)
  63. continue
  64. }
  65. if !(ln.SrcId() == sf.Id_ || ln.Id() == sf.Id_) {
  66. msgErr += fmt.Sprintf("UseGroupLink.Check(): ссылка %q не взаимная\n", id)
  67. continue
  68. }
  69. }
  70. return msgErr
  71. }
  72. // Links -- ссылки вариантов использования
  73. func (sf *ArchGroupLink) Links() []alias.ArchId {
  74. return sf.Links_
  75. }