use_group_link.go 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  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/pkg/elems/elem_base"
  8. )
  9. // UseGroupLink -- группа связей в вариантах использования
  10. type UseGroupLink struct {
  11. *elem_base.ElemBase
  12. Links_ []alias.Id `json:"link"` // Связи объекта
  13. }
  14. // NewUseGroupLink -- возвращает новый группу связей в вариантах использования
  15. func NewUseGroupLink(elem map[string]interface{}) (*UseGroupLink, error) {
  16. elemBase, err := elem_base.NewElemBase(elem)
  17. if err != nil {
  18. return nil, fmt.Errorf("NewActor(): in create BaseSvg, err=\n\t%w", err)
  19. }
  20. id := elemBase.Id_
  21. _links0, isOk := elem["links"]
  22. if !isOk {
  23. return nil, fmt.Errorf("NewUseGroupLink(): id=%q, field `links` not found", id)
  24. }
  25. _links, isOk := _links0.([]interface{})
  26. if !isOk {
  27. return nil, fmt.Errorf("NewUseGroupLink(): id=%q, field `links`(%T, %+v) not []interface{}", id, _links0, _links0)
  28. }
  29. var links []alias.Id
  30. for _, _id := range _links {
  31. id0, isOk := _id.(string)
  32. if !isOk {
  33. return nil, fmt.Errorf("NewUseGroupLink(): id=%q, field `links`(%T, %+v) not string", id, _id, _id)
  34. }
  35. id1 := alias.Id(id0)
  36. if id1 == "" {
  37. return nil, fmt.Errorf("NewUseGroupLink(): id=%q, link=%q is empty", id, _id)
  38. }
  39. links = append(links, id1)
  40. }
  41. sf := &UseGroupLink{
  42. ElemBase: elemBase,
  43. Links_: links,
  44. }
  45. return sf, nil
  46. }
  47. // Check -- проверяет ошибки связей
  48. func (sf *UseGroupLink) Check(mapElem map[alias.Id]types.IElemDrawer) string {
  49. var msgErr string
  50. if len(sf.Links_) == 0 {
  51. msgErr = "Список ссылок(links) пуст\n"
  52. }
  53. // Проверить, что ссылки реально существует
  54. for _, id := range sf.Links_ {
  55. link, ok := mapElem[id]
  56. if !ok {
  57. msgErr += fmt.Sprintf("UseGroupLink.Check(): ссылка %q не существует\n", id)
  58. continue
  59. }
  60. ln, isOk := link.(types.ILinker)
  61. if !isOk {
  62. msgErr += fmt.Sprintf("UseGroupLink.Check(): ссылка %q не ILinker\n", id)
  63. continue
  64. }
  65. if !(ln.SrcId() == sf.Id() || ln.DstId() == sf.Id()) {
  66. msgErr += fmt.Sprintf("UseGroupLink.Check(): ссылка %q не взаимная\n", id)
  67. continue
  68. }
  69. }
  70. return msgErr
  71. }
  72. // Links -- ссылки вариантов использования
  73. func (sf *UseGroupLink) Links() []alias.Id {
  74. return sf.Links_
  75. }