use_case.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. // package use_case -- вариант использования
  2. package use_case
  3. import (
  4. "fmt"
  5. "gitp78su.ipnodns.ru/svi/goarch/lev0/alias"
  6. "gitp78su.ipnodns.ru/svi/goarch/lev0/cons"
  7. "gitp78su.ipnodns.ru/svi/goarch/lev0/types"
  8. "gitp78su.ipnodns.ru/svi/goarch/pkg/elems/elem_base"
  9. "gitp78su.ipnodns.ru/svi/goarch/pkg/elems/size"
  10. )
  11. // UseCase -- вариант использования
  12. type UseCase struct {
  13. *elem_base.ElemBase
  14. *size.Size
  15. Links_ []alias.Id `json:"links"` // Список ссылок
  16. }
  17. // NewUseCase -- возвращает новый вариант использования
  18. func NewUseCase(elem map[string]interface{}) (*UseCase, error) {
  19. elemBase, err := elem_base.NewElemBase(elem)
  20. if err != nil {
  21. return nil, fmt.Errorf("NewUseCase(): in create BaseSvg, err=\n\t%w", err)
  22. }
  23. id := elemBase.Id_
  24. _links0, isOk := elemBase.Elem_["links"]
  25. if !isOk {
  26. return nil, fmt.Errorf("NewUseCase(): id=%q, field `links` not found<br>%+v", id, elemBase.StrElem_)
  27. }
  28. _links, isOk := _links0.([]interface{})
  29. if !isOk {
  30. return nil, fmt.Errorf("NewUseCase(): id=%q, `links`(%+v) not []interface{}", id, _links0)
  31. }
  32. var links []alias.Id
  33. for _, _id := range _links {
  34. id0, isOk := _id.(string)
  35. if !isOk {
  36. return nil, fmt.Errorf("NewUseCase(): id=%q, `link`(%T, %+v) not string", id, _id, _id)
  37. }
  38. id1 := alias.Id(id0)
  39. if id1 == "" {
  40. return nil, fmt.Errorf("NewUseCase(): id=%q, `link` is empty", id)
  41. }
  42. links = append(links, id1)
  43. }
  44. sf := &UseCase{
  45. ElemBase: elemBase,
  46. Size: size.NewSize("size", elem),
  47. Links_: links,
  48. }
  49. return sf, nil
  50. }
  51. // Check -- проверяет корректность элемента
  52. func (sf *UseCase) Check(mapElem map[alias.Id]types.IElemDrawer) string {
  53. var msgErr string
  54. // Нет ссылок
  55. if len(sf.Links_) == 0 {
  56. return fmt.Sprintf("id=%q, нет собственных ссылок", sf.Id_)
  57. }
  58. // Проверить, что ссылки реально существует
  59. for _, id := range sf.Links_ {
  60. link, ok := mapElem[id]
  61. if !ok {
  62. msgErr += fmt.Sprintf("id=%q, собственная ссылка не существует\n", id)
  63. continue
  64. }
  65. if link.Type() != cons.TypeUseLink {
  66. msgErr += fmt.Sprintf("id=%q, не тип %q, тип=%q\n", id, cons.TypeUseLink, link.Type())
  67. continue
  68. }
  69. ln, isOk := link.(types.ILinker)
  70. if !isOk {
  71. msgErr += fmt.Sprintf("id=%q, не тип `link`, link=%#v\n", id, link)
  72. continue
  73. }
  74. // Проверить что ссылка взаимная
  75. if !(ln.SrcId() == sf.Id_ || ln.DstId() == sf.Id_) {
  76. msgErr += fmt.Sprintf("id=%q, ссылка не взаимная\nsrc=%q, dst=%q\n", id, ln.SrcId(), ln.DstId())
  77. }
  78. }
  79. return msgErr
  80. }
  81. // Links -- ссылки вариантов использования
  82. func (sf *UseCase) Links() []alias.Id {
  83. return sf.Links_
  84. }